8.1 不定方程问题

8-1 buychicken1.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int x,y,z;
 5     for(x=0;x<=20;x++)
 6     {
 7         for(y=0;y<=33;y++)
 8         {
 9             z=100-x-y;
10             if (z%3==0 &&x*5+y*3+z/3==100)
11                 printf("公鸡:%d,母鸡:%d,小鸡:%d\n",x,y,z);
12         }
13     }
14     getch();
15     return 0;
16 }

8-2 buychicken2.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int x,y,z,k;
 5     for(k = 0; k <= 3; k++)
 6     {
 7         x=4*k;
 8         y=25-7*k;
 9         z=100-x-y;
10         printf("公鸡:%d,母鸡:%d,小鸡:%d\n", x, y, z);
11     }
12     getch();
13     return 0;
14 }

8-3 bank.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4     double rate[7];//保存6种整存整取的利率(活期、3月、半年、一年、二年、三年、五年)
 5     double money,total,temp;//计划存入金额
 6     int month,j; //计划存钱的总月数
 7     int y5,y3,y2,y1,y01,y02,y03;//分别表示使用不同档存钱的次数
 8     int timer[7];//保存各档存的次数
 9     /*
10     printf("活期的年利率:");
11     scanf("%lf",&rate[0]);
12     printf("整存整取3月期的年利率:");
13     scanf("%lf",&rate[1]);
14     printf("整存整取半年期的年利率:");
15     scanf("%lf",&rate[2]);
16     printf("整存整取1年期的年利率:");
17     scanf("%lf",&rate[3]);
18     printf("整存整取2年期的年利率:");
19     scanf("%lf",&rate[4]);
20     printf("整存整取3年期的年利率:");
21     scanf("%lf",&rate[5]);
22     printf("整存整取5年期的年利率:");
23     scanf("%lf",&rate[6]);
24     */
25     rate[0]=0.36;
26     rate[1]=1.71;
27     rate[2]=1.98;
28     rate[3]=2.25;
29     rate[4]=2.79;
30     rate[5]=3.33;
31     rate[6]=3.6;
32     printf("存款总数:");
33     scanf("%lf",&money);
34     printf("存款总月数:");
35     scanf("%d",&month);
36     for(j=0;j<=6;j++)
37         rate[j]=rate[j]/12/100;
38     total=money;
39     y5=0;
40     do{
41         y3=0;
42         do{
43             y2=0;
44             do{
45                 y1=0;
46                 do{
47                   y01=0;
48                   do{
49                       y02=0;
50                       do{
51                           y03=month-60*y5-36*y3-24*y2-12*y1-6*y01-3*y02;//剩余月数 按活期计息
52                           if(y03<0) break; //若存款月份超过总月数,则跳出本层循环
53                           temp=money*pow(1+rate[1]*3,(double)y02)
54                                      *pow(1+rate[2]*6,(double)y01)
55                                      *pow(1+rate[3]*12,(double)y1)
56                                      *pow(1+rate[4]*12*2,(double)y2)
57                                      *pow(1+rate[5]*12*3,(double)y3)
58                                      *pow(1+rate[6]*12*5,(double)y5)
59                                      *pow(1+rate[0],(double)y03);
60                           if(temp>total)
61                           {
62                               total=temp;
63                               timer[0]=y03;
64                               timer[1]=y02;
65                               timer[2]=y01;
66                               timer[3]=y1;
67                               timer[4]=y2;
68                               timer[5]=y3;
69                               timer[6]=y5;
70                           }
71                           y02++; //增加一次3月期
72                       }while(y02<=(month-y5*60-y3*36-y2*24-y1*12-y01*6)/3);
73                       y01++;//增加1次半年期
74                   }while(y01<=(month-y5*60-y3*36-y2*24-y1*12));
75                   y1++;//增加1次1年期
76                 }while(y1<=(month-y5*60-y3*36-y2*24)/12);
77                 y2++;//增加1次2年期
78             }while(y2<=(month-y5*60-y3*36)/24);
79             y3++; //增加1次3年期
80         }while(y3<=(month-y5*60)/36);
81         y5++;                        //增加1次5年期
82     }while(y5<=month/60);
83     printf("总金额:%.2lf,共存%d月,可按以下方式进行转存,本利合计:%.2lf\n",money,month,total);
84     printf("5年期存%d次\n",timer[6]);
85     printf("3年期存%d次\n",timer[5]);
86     printf("2年期存%d次\n",timer[4]);
87     printf("1年期存%d次\n",timer[3]);
88     printf("半年期存%d次\n",timer[2]);
89     printf("3月期存%d次\n",timer[1]);
90     printf("活期存%d次\n",timer[0]);
91     getch();
92     return 0;
93 }

8-4 ladder.c

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int ladder=7;
 5     while(1)
 6     {
 7         if((ladder%2==1) && (ladder%3==2) && (ladder%5==4) && (ladder%6==5))
 8             break;
 9         ladder+=7;
10     }
11     printf("该阶梯至少有%d阶。\n",ladder);
12     getch();
13     return 0;
14 }
时间: 2024-08-27 03:59:55

8.1 不定方程问题的相关文章

extend_gcd求解不定方程/膜线性方程/乘法逆元

形如a*x+b*y=c 为不定方程,a,b>0其实无所谓,因为gcd(a,b)=gcd(|a|,|b|)   //gcd为最大公约数 由数论的定理所知,当c%gcd==0,不定方程有解,现在我们来求这个解. gcd=gcd(a,b);a*b=gcd*lcm;  //lcm为最小公倍数 a'=a/gcd;b'=b/gcd;c'=c/gcd; a'目前与b'互质 令c''=1=a'*x+b'*y; 利用extend_gcd求出一组特解.(x0,y0) (x0*c'.y0*c')为 a'*x+b'*y

【pku2115-C Looooops】拓展欧几里得-不定方程

http://poj.org/problem?id=2115 题解:一个变量从A开始加到B,每次加C并mod2^k,问加多少次.转化为不定方程:C*x+2^K*Y=B-A //poj2115 #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> using namespace std; typedef long long LL; LL bit[40]; LL tx,ty

数论之拓展欧几里得求解不定方程和同余方程组(一)

今天接到scy的压缩包,开始做数论专题.那今天就总结一下拓展欧几里得求解不定方程和同余方程组. 首先我们复习一下欧几里得算法: 1 int gcd(int a,int b){ 2 if(b==0) return a; 3 return gcd(b,a%b);4 } 拓展欧几里得算法: 推导过程: 给出A和B,求它们的最大公约数,并且求出x和y,满足Ax+By=gcd(A,B). 当A=0时,x=0,y=1; 当A>0时, 因为exgcd(A,B,x,y)表示Ax+By=gcd(A,B) 而且ex

解线性不定方程

1, 定义:线性不定方程是指ax + by = c. 2, 给出整数a, b, c,先求出一组解,然后讨论如何表示通解(所有解).首先设gcd(a; b) = d.如果c不是d的倍数,那么方程无解,因为左边是d的倍数,而右边不是.在有解的情况,设c = c0 £ d,则可以先求出ax + by = d的一组(x0; y0),则ax0 + by0 = d,两边乘以c0得:a(c0x0) + b(c0y0) = c,因此(c0x0; c0y0)是原方程的一组解.换句话说,核心问题是:求ax + by

二元线性不定方程和模线性方程

二元线性不定方程: 有方程ax+by=c;首先必须满足gcd(a,b)|c;否则无解. 所以我们可以用扩欧求出一组特解:ax0+by0=gcd(a,b); 然后我们可以知道a(x1-x2)=b(y2-y1),b|(x1-x2),a|(y2-y1); 所以

【初等数论】 06 - 不定方程

前面介绍的只是初等数论的基本概念,它有很多的应用场景,如果有机会以后我们还会看到,这里我只想单独举出不定方程的例子.不定方程又叫丢潘图方程,它们以整数(或有理数)为变量和参数,而且有两个以上的未知数,多以多项式形式出现.不定方程既是数论的应用,也是数论理论形成的来源,对不定方程的思考会动用起你全部的数论知识.这里仅列举一些简单的问题,作为知识巩固也好,作为娱乐欣赏也行. 1. 一次不定方程 最简单的不定方程就是一次方程(1),它表现为一个多元线性方程.如果你还记得前面最大公约数的线性组合定义,就

扩展欧几里得算法求解不定方程【例 poj 1061】

扩展欧几里得算法是数论当中一种常用的算法,他可以用如下的姿势来表达: 设a, b为不全为0的整数,则存在整数x和y,使得 gcd(a, b) = a*x + b*y. 证明就略去. 树上还有一个拉梅定理:用欧几里得算法计算两个正整数的最大公因子时,所需要的除法次数不会超过两个整数中较小的那个十进制数的倍数的5倍. 拉梅定理的一个推论:求两个正整数a, b, a > b的最大公因子需要O(log2a)3次的位运算. 至于拉梅定理有什么用,暂时还没有研究=—=. 例1 求225和21的最大公因子s,

同余方程,不定方程总结

听说这是数论中比较重要的部分了,一点点的总结吧.. 一.线性同余方程与不定方程: 单个一元线性方程 求解方法:扩展欧几里得 exgcd 模板: long long exgcd(long long a,long long b,long long &x,long long &y) { if(!b) { x=1; y=0; return a; } __int64 tt=exgcd(b,a%b,x,y); __int64 t; t=x; x=y; y=(t-a/b*y); return tt; }

扩展欧几里德算法—求解不定方程,线性同余方程

#include<stdio.h> int extended_gcd(int a,int b,int &x,int &y) { int r,t; if(!b) { x = 1; y = 0; return a; } r = extended_gcd(b,a%b,x,y); t = x; x = y; y = t-a/b*y; return r; } int main() { int a,b,x,y,z; scanf("%d%d",&a,&b)

BZOJ 3129 [Sdoi2013]方程 不定方程解的个数+组合数取模

题意:链接 方法:不定方程解的个数+组合数取模 解析: 先看n1与n2的部分的限制. 对于后半部分的限制来说,我们直接减去An1+i?1就可以转化一下求正整数解. 但是前半部分呢? 跟上一道猴子那个很像. 所以我们容斥搞就行了. 但是这道题好像不好写的地方不在这? 这题TMD不就是礼物吗! 大组合数取模如何取? 请参见我<BZOJ 礼物>的题解. 另外吐槽题干 明明是X1+X2+-+Xn=m 并不是小于等于 代码: #include <cstdio> #include <cs