c语言假币问题的编程,假币问题 (C语言代码)

解题思路:/*

将硬币平均分成三堆:A,B,C,若不能平分,则需保证A,B两堆必须数目相同,且A,B的数量要比C多,

其中AB用于称重比较

对于一次称重,若A == B,则假币在C,若A != B,则,假币在轻的那堆。

然后对假币所在的那堆,继续分三堆处理……

直到找到假币

注意:虽然分两堆,也能找到假币,但显然需要称重的次数要比分三堆的次数多一些,不符合题目要求。

A,B的数量要比C多,是为了保证算法的正确性,比如 N = 8,可分成,2 2 4 或者 3 3 2。

若按照 3 3 2分堆,则总共需要称重2次,若分成2 2 4分堆,则总共需要称重3次,显然不是最优解。

*/

参考代码:#include 

long chengzhongcishu(long n);

int main(void){

long n;

while(1){

scanf("%ld",&n);

if(n == 0) break;

else {

printf("%ld\n",chengzhongcishu(n));

}

}

return 0;

}

long chengzhongcishu(long n){

long cishu = 0;

if(n == 1) return 0;

else if(n == 2 || n == 3) return 1;

else {

cishu++;

while(n>3){

if(n % 3 == 0){

n = n/3;

cishu++;

}else {

n = n/3 +1;

cishu++;

}

}

return cishu;

}

}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分治法是一种解决问题的思想,通过将问题分解成更小的部分,逐步解决这些部分来解决整个问题。对于找假币问题,可以将硬币分成两堆,并比较两堆硬币的重量。 以下是C语言代码示例: ```c #include <stdio.h> // 定义假币重量 #define FAKE_COIN_WEIGHT 10 // 使用分治法找到假币 int findFakeCoin(int coins[], int start, int end) { // 如果只有一枚硬币 if (start == end) { // 判断是否是假币 if (coins[start] == FAKE_COIN_WEIGHT) { return start; } else { return -1; // 没有找到假币 } } // 硬币总数为偶数,分成两等份 int middle = (start + end) / 2; int leftSum = 0, rightSum = 0; // 计算左边硬币重量总和 for (int i = start; i <= middle; i++) { leftSum += coins[i]; } // 计算右边硬币重量总和 for (int i = middle + 1; i <= end; i++) { rightSum += coins[i]; } // 如果左右两边总和不相等,则继续分治 if (leftSum != rightSum) { // 左边总和大于右边,假币在左边 if (leftSum > rightSum) { return findFakeCoin(coins, start, middle); } else { // 右边总和大于左边,假币在右边 return findFakeCoin(coins, middle + 1, end); } } else { return -1; // 没有找到假币 } } int main() { int coins[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10}; // 假币重量为10 int numCoins = sizeof(coins) / sizeof(coins[0]); int fakeCoinIndex = findFakeCoin(coins, 0, numCoins - 1); if (fakeCoinIndex != -1) { printf("找到了假币,索引为:%d\n", fakeCoinIndex); } else { printf("没有找到假币\n"); } return 0; } ``` 上述代码中,通过分治法将硬币分成两等份,并计算左右两边硬币的重量总和。如果左右两边总和不相等,则继续分治,直到找到假币或确定没有假币。最终输出假币的索引或提示没有找到假币

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值