韩信点兵--中国剩余定理

本文详细解析了韩信点兵的故事及其背后的数学原理,并通过编程实现了一个解决类似问题的算法。文章还探讨了如何利用该算法解决实际问题,以及其在不同场景中的应用。
传说西汉大将韩信,由于比较年轻,开始他的部下对他不很佩服。有一次阅兵时,韩信要求士兵分三路纵队,结果末尾多2人,改成五路纵队,结果末尾多3人,再改成七路纵队,结果又余下2人,后来下级军官向他报告共有士兵2395人,韩信立即笑笑说不对(因2395除以3余数是1,不是2),由于已经知道士兵总人数在2300?/FONT>2400之间,所以韩信根据23,128,233,------,每相邻两数的间隔是105,便立即说出实际人数应是2333人(因2333=128+20χ105+105,它除以3余2,除以5余3,除以7余2)。这样使下级军官十分敬佩,这就是韩信点兵的故事。 


   简化:已知 n%3=2,n%5=3,n%7=2,求n。 
   再看我们这道题,读入p,e,i,d 4个整数,已知(n+d)%23=p; (n+d)%28=e; (n+d)%33=i ,求n 。 

   韩信应该是这样算的: 
      因为n%3=2,n%5=3,n%7=2且3,5,7互质 
      使5×7被3除余2,用35×2=70; 
       使3×7被5除余1,用21×1=21; 
       使3×5被7除余1,用15×1=15。 
      (70×2+21×3+15×2)%(3×5×7)=23 

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int f1 = 3,f2 = 5,f3 = 7;
    int q1 = f2*f3*(f2*f3%f1),q2 = f1*f3*(f1*f3%f2),q3 = f1*f2*(f1*f2%f3);
    int a,b,c;
    int ans;
    int i = 0;

    while(~scanf("%d%d%d",&a,&b,&c))
    {
        i++;
        ans = (q1*a+q2*b+q3*c)%(f1*f2*f3);
        if(ans>=10&&ans<=100)
            printf("Case %d: %d\n",i,ans);
        else printf("Case %d: No answer\n",i);
    }
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值