Ваш код недостаточно жадный, потому что он может быть худшим:
#include<stdio.h>
#include<stdlib.h>
int main(){
int hundreds=0,tens=0,ones=0,sum=0;
printf("Enter a sum of money in range 1 to 999\n");
if ((scanf("%d",&sum) == 1) && (sum >= 1) && (sum <= 999)) {
while(sum!=0) {
if (sum<10&&sum>=1){
ones += 1;
sum -= 1;
}
else if(sum>=10&&sum<100){
tens += 1;
sum -= 10;
}
else if(sum>=100&&sum<=999){
hundreds += 1;
sum -= 100;
}
else{ /* impossible case in fact */
printf("Error");
exit(0);
}
}
printf("%d $100, %d $10, %d $1\n",hundreds,tens,ones);
}
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra g.c
pi@raspberrypi:/tmp $ ./a.out
Enter a sum of money in range 1 to 999
997
9 $100, 9 $10, 7 $1
Как мне доказать, что программа правильная
(жадный) способ доказать, что код верен, - использовать грубую силу, чтобы проверить все результаты от 1 до 999:
#include<stdio.h>
#include<stdlib.h>
int main(){
int n;
for (n = 1; n <= 999; ++n) {
/* the algo */
int hundreds=0,tens=0,ones=0, sum = n;
while(sum!=0) {
if (sum<10&&sum>=1){
ones += 1;
sum -= 1;
}
else if(sum>=10&&sum<100){
tens += 1;
sum -= 10;
}
else if(sum>=100&&sum<=999){
hundreds += 1;
sum -= 100;
}
else{ /* impossible case in fact */
printf("Error");
exit(0);
}
}
/* check */
if ((hundreds*100 + tens*10 + ones) != n) {
printf("error for %d : %d $100, %d $10, %d $1\n",n, hundreds,tens,ones);
exit(0);
}
}
puts("all ok");
return 0;
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra g.c
pi@raspberrypi:/tmp $ ./a.out
all ok