百钱买百鸡问题-C、Python中对照错误

C 源码

#include <stdio.h>

int main(int args,char**argc){
	int x=5,y=3,z=1;
	
	for(int i=0;i <= 100;i++){
		for(int j = 0;j <= 100;j++){
			for(int k = 0;k <= 100;k++){
				if (i*5 + j*3 + (k/3) ==100 && i + j + k == 100){
					printf("%d,%d,%d\n",i,j,k);
				}
			}
		}
	}	
//	printf("Hey c");
}
输出

C语言执行结果

Python 源码

x = 5
y = 3
z = 1
count = 0
for i in range(0, 100):
    for j in range(0,100):
        for k in range(0,100):
            if i*5 + j*3 +k/3 == 100 and i + j + k == 100:
                print("公鸡:{0:02d}只,母鸡:{1:02d}只,小鸡:{2:02d}只".format(i,j,k))
                count +=1
print("总共:{}种分法".format(count))

输出

Python结果

可以看到结果是Python输出是C输出的子集,然后需要进一步探索,我认为肯定是语言的某些特性导致的,Python作为动态语言,而C为静态语言,所谓“静、动”就是变量声明是否定义。很显然C要定义另一个否之。
将问题给到ChatGPT中:

Q: #include <stdio.h> int main(int args,char**argc){ int x=5,y=3,z=1; for(int i=0;i <= 100;i++){ for(int j = 0;j <= 100;j++){ for(int k = 0;k <= 100;k++){ if (i*5 + j*3 + (k/3) ==100 && i + j + k == 100){ printf("%d,%d,%d\n",i,j,k); } } } } // printf("Hey c"); }
A:(以上c语言编写的程序,输出结果如下:0,25,75 3,20,77 4,18,78 7,13,80 8,11,81 11,6,83 12,4,84,和标准结果的不一样,请从c语言分析问题)

给出答案:
具体问题在于对鸡雏数量 k的处理。在C语言中,整数除法
k/3会截断小数部分,导致结果不准确。例如,当 k=77时,
的结果是25,而不是25.6667,这会导致条件判断出错。

最后修改如下

//以上省略
for (int k = 0; k <= 100; k += 3) { // 确保 k 是3的倍数
                if (i * 5 + j * 3 + k / 3.0 == 100 && i + j + k == 100){
				}
 }
//以下省略

结果

C处理结果
学习自:枚举-计算-验证_哈来自尔滨工业大学

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值