例15   除法算式

问题描述

输入正整数n(2≤n≤68),按从小到大输出所有形如abcde/fghi=n的表达式。其中a~i为1~9的一个排列。

输入格式

每行为一个正整数n (n <= 1500),输入n=0结束。

输出格式

输出满足条件的所有形如abcde/fghi=n的表达式,每个表达式占一行,具体格式参见输出样例。

输入样例

4

20

62

0

输出样例

15768/3942=4

17568/4392=4

23184/5796=4

31824/7956=4

No Solution!

79546/1283=62

94736/1528=62

(1)编程思路。

本例需要先确定好穷举的思路。虽然题目说a~i为1~9的一个排列,但穷举1~9的所有排列显然没有必要。

可以穷举除数fghi,这是一个4位数,最小可为1234,最大可为9876,然后按fghi*n计算出abcde,最后判断这9个数字是否不相同。

为判断9个数字是否相同,可以定义一个数组flag[10],其中flag[i]的值表示数字i在算式中出现的次数,显然flag[1]~flag[9]的值全为1才满足要求。

另外,在穷举时进行适当优化。若计算出abcde小于12345,显然除数fghi太小,直接增大除数进行下次穷举;若计算出abcde大于98765,显然除数fghi太大,不再可能找到解,直接退出穷举循环。

(2)源程序。

#include <stdio.h>

int main()

{

int n,x,y,i,flag[10],t;

while (scanf("%d",&n) && n!=0)

{

t=0;

for (y=1234;y<=9876;y++)

{

x=y*n;

if (x<12345) continue;

if (x>98765) break;

for (i=0;i<10;i++)

flag[i]=0;

flag[x/10000]++; flag[x%10000/1000]++;

flag[x%1000/100]++; flag[x%100/10]++;

flag[x%10]++;

flag[y/1000]++; flag[y%1000/100]++;

flag[y%100/10]++; flag[y%10]++;

for (i=1;i<10;i++)

if (flag[i]!=1) break;

if (i==10)

{

printf("%d/%d=%d\n",x,y,n);

t++;

}

}

if (t==0) printf("No Solution!\n");

}

return 0;

}

习题15

15-1  完美立方

问题描述

a3 +b3 + c3 = d3为完美立方等式。例如13 + 63 + 83 =93。编写一个程序,输出100以内的所有四元组(a, b, c, d),使得a3 +b3 + c3 = d3,其中1≤a< b< c< d≤100。

输入格式

无输入

输出格式

100以内所有满足a3 +b3 + c3 = d3的四元组(a, b, c, d),每行输出5组。

输入样例

无输入

输出样例

(  3,  4,  5,  6)  ( 1, 6,  8,  9)  ( 6,  8, 10, 12)  (  2, 12, 16, 18)  (  9, 12, 15, 18)

(  3,  10, 18, 19)  ( 7, 14, 17, 20)  ( 12, 16, 20, 24)  (  4, 17, 22, 25)  (  3, 18, 24, 27)

……

(1)编程思路。

因为要求100以内所有满足a3 +b3 + c3 = d3的四元组(a, b, c, d),因此先定义一个数组int cube[101];,且cube[i]的值赋i3,以便于后面直接引用。

从d出发进行穷举,则穷举范围为

6≤d≤100

1≤a≤d-3

a+1≤b≤d-2

b+1≤c≤d-1

(2)源程序。

#include <stdio.h>

int main()

{

int  i, a, b, c, d,cnt=0;

int cube[101];

for (i=1 ; i<=100; i++)

cube[i]=i*i*i;

for (d=6 ; d<=100; d++)

for (a=1; a<d-2; a++ )

{

if (cube[d] <cube[a]+cube[a+1]+cube[a+2]) break;  // 没必要继续搜索b 和c

for (b=a+1 ; b<d-1; b++)

{

if (cube[d] <cube[a]+cube[b]+cube[b+1])  break; //  没必要继续搜索c

for (c=b+1; c<d;  c++)

if (cube[d]==cube[a]+cube[b]+cube[c])

{

cnt++;

printf("(%3d,%3d,%3d,%3d)  ",a,b,c,d);

if (cnt%5==0) printf("\n");

}

}

}

return 0;

}

15-2  分数拆分

问题描述

输入正整数k,找到所有的正整数x≥y,使得1/k=1/x+1/y。

输入格式

输入包含多组测试数据,每组为一行,一个正整数k。

输出格式

对每组数据先输出解的个数,然后输出全部的解,没个解占一行。具体格式参见输出样例。

输入样例

2

12

输出样例

2

1/2=1/6+1/3

1/2=1/4+1/4

8

1/12=1/156+1/13

1/12=1/84+1/14

1/12=1/60+1/15

1/12=1/48+1/16

1/12=1/36+1/18

1/12=1/30+1/20

1/12=1/28+1/21

1/12=1/24+1/24

(1)编程思路。

乍一看穷举的范围好像无法确定,但由于x≥y, 有1/x≤1/y,

因此由1/k=1/x+1/y 可知  1/y =1/k-1/x≥1/k-1/y, 故 2/y≥1/k  即y≤2k。当然y≥k+1。这样只要在k+1~2k范围之内穷举y,然后根据y尝试计算出x即可。

(2)源程序1。

#include <stdio.h>

int main()

{

int k;

while (scanf("%d",&k)!=EOF)

{

int x,y,cnt=0;

for (y=k+1;y<=2*k;y++)

{

if(k*y%(y-k)==0)

{

cnt++;

}

}

printf("%d\n",cnt);

for (y=k+1;y<=2*k;y++)

{

if(k*y%(y-k)==0)

{

x=k*y/(y-k);

printf("1/%d=1/%d+1/%d\n",k,x,y);

}

}

}

return 0;

}

(3)源程序2。

在源程序1中,穷举的循环进行了两次,一次用循环求出解的个数,另一次用循环输出各个解的情况。显然,可以在用循环求解的个数时用数组将求得的解的情况保存下来,这样就不用再次循环求解,直接输出用数组保存的解的情况即可。

#include <stdio.h>

int main()

{

int k;

while (scanf("%d",&k)!=EOF)

{

int cnt=0;

int t;

int x[2*k],y[2*k];

for (t=k+1;t<=2*k;t++)

{

if(k*t%(t-k)==0)

{

x[cnt]=k*t/(t-k);

y[cnt]=t;

cnt++;

}

}

printf("%d\n",cnt);

for (t=0;t<cnt;t++)

{

printf("1/%d=1/%d+1/%d\n",k,x[t],y[t]);

}

}

return 0;

}

注意:在上面的源程序2中,x和y数组是定义的可变长数组,现在的C标准支持这样的用法。

15-3  一数三平方

问题描述

有一类六位数,不仅它本身是平方数,而且它的前三位与后三位也都是平方数,这类数称为“一数三平方数”。

输入格式

无输入

输出格式

输出所有的一数三平方数。每行输出一个一数三平方数,具体格式参见输出样例。

输入样例

无输入

输出样例

144400 : 12*12=144,20*20=400,380*380=144400

225625 : 15*15=225,25*25=625,475*475=225625

……

(1)编程思路。

如果程序对所有的六位数(100000~999999)进行穷举,判断这个六位数是否是一数三平方,显然比较麻烦。

由于一个“一数三平方”数,其前三位与后三位一定都是平方数,因此,可以先求出999以内的所有的平方数,最多只有32个(即0的平方~31的平方,32的平方1024超过了3位)。定义一个数组int a[32]来保存这32个平方数。

程序中对这32个平方数两两组成的六位数进行穷举判断,显然高三位必须为数组中a[10](即不小于10的平方100的数首位才不为0)之后的平方数。算法描述为:

for(i=10;i<=31;i++)

for(j=0;j<=31;j++)

{

c=1000*a[i] +a[j];              // a[i]作为高三位、a[j]作为低三位构成六位数

if( c是平方数)

输出相应信息并计数

}

(2)源程序。

#include <stdio.h>

#include <math.h>

int main()

{

int a[32],i,j;

long b,c,t;

for(i=0;i<=31;i++)              // 统计出从0到999之内的所有平方数

a[i]=i*i;

for(i=10;i<=31;i++)

{

b=1000*a[i];                                /*高三位数*/

for(j=0;j<=31;j++)

{

c=b+a[j];                              /*六位数*/

t=sqrt(c);                             /*六位数开方*/

if(c==t*t)                             /*判断六位数是否为平方数*/

{

printf("%d : %d*%d=%d,%d*%d=%d,%d*%d=%d\n",c,i,i,a[i],j,j,a[j],t,t,c);

}

}

}

return 0;

}

C语言程序设计100例之(15):除法算式的更多相关文章

  1. 黑马程序员——经典C语言程序设计100例

    1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯 ...

  2. C语言程序设计100例之(22):插入排序

    例22  插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一 ...

  3. C语言程序设计100例之(23):数列求和

    例23  数列求和 问题描述 已知某数列前两项为2和3,其后继项根据前面最后两项的乘积,按下列规则生成: ① 若乘积为一位数,则该乘积即为数列的后继项: ② 若乘积为二位数,则该乘积的十位上的数字和个 ...

  4. C语言程序设计100例之(16):巧解算式

    例16  巧解算式 问题描述 在1.2.3.4.5.6.7.8.9.10个数中间加上加号或减号,使得到的表达式的值为自然数N,如果中间没有符号,则认为前后为一个数,如1 2 3认为是一百二十三(123 ...

  5. C语言程序设计100例之(26):二进制数中1的个数

    例26   二进制数中1的个数 问题描述 如果一个正整数m表示成二进制,它的位数为n(不包含前导0),称它为一个n位二进制数.所有的n位二进制数中,1的总个数是多少呢? 例如,3位二进制数总共有4个, ...

  6. C语言程序设计100例之(9):生理周期

    例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如 ...

  7. C语言程序设计100例之(4):水仙花数

    例4    水仙花数 题目描述 一个三位整数(100-999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数. 输入格式 没有输入 输出格式 若 ...

  8. C语言程序设计100例之(10):最大公约数

    例10        最大公约数 问题描述 有三个正整数a,b,c(0<a,b,c<10^6),其中c不等于b.若a和c的最大公约数为b,现已知a和b,求满足条件的最小的c. 输入数据 第 ...

  9. C语言程序设计100例之(14):丑数

    例14   丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个 ...

随机推荐

  1. Centos7使用离线安装包rpm安装MySQL5.6

    参考地址: https://blog.csdn.net/ai_64/article/details/100557530 https://dev.mysql.com/doc/refman/5.6/en/ ...

  2. Django大纲

    Django框架 ........ 2.聚合查询 分组 F与Q查询 字段 及其 参数 | 数据库的三大范式 3.orm查询优化 MTV与MVC模型 choice参数 ajax serializers ...

  3. 两个div,都设置未inline-block,可是在IE出现错位问题

    [实现要求] 红色的和黄色的内容撑开,蓝色包住红黄,不定框居中显示 [遇到问题] chrome显示正常,但是在IE上红黄框会出现错位的问题 [如何解决]  给红色框添加一个overflow:hidde ...

  4. gitbook 入门教程之网站域名备案 icp 插件

    欢迎访问 gitbook-plugin-icp 官网

  5. Python Weekly 422

    新闻 Python 采用12个月作为发布周期 链接: https://mail.python.org/archives/list/python-dev@python.org/thread/KE7OS4 ...

  6. 集群环境下,你不得不注意的ASP.NET Core Data Protection 机制

    引言 最近线上环境遇到一个问题,就是ASP.NET Core Web应用在单个容器使用正常,扩展多个容器无法访问的问题.查看容器日志,发现以下异常: System.Security.Cryptogra ...

  7. 如何利用PS将照片背景替换为白色

    需求:将照片中的蓝底换成白底: 操作步骤: 1.打开图片,点击背景图层: 2.利用套索,选中除背景外的区域: 3.右键,反选: 4.填充为“白色”,确定,保存:

  8. ORA-27140: attach to post/wait facility failed

    Errors in file /home/u01/app/oracle/diag/rdbms/hnybdb21/hnybdb211/trace/hnybdb211_j000_143099.trc:OR ...

  9. LAMP环境搭建与配置(1)

    安装和配置MySQL.Apache.PHP 概念 LAMP是Linux Apache MySQL PHP 的简写,把Apache.MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的 ...

  10. 利用keras自带路透社数据集进行多分类训练

    import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...