竖式问题
程序员文章站
2022-06-07 14:42:43
...
问题描述:找出所有形如abc*de(三位数乘两位数)的算式,使得在完整的竖式中,所有的数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后有一个空行。最后输出解得总数。具体格式详见样例输出(为了便于观察,竖式中的空格改用小数点表示,但是所写程序中应该输出空格,而非小数点)
样例输入:2357
样例输出:
<1>
..775
X..33
-----
.2325
2325.
-----
25575
The number of solutions = 1
参考代码如下
//思路一,方法一:用数组实现
//整体思路:从所给集合中挑取三位数乘两位数,进行判断; 参考代码的思路是穷举出所有三位数乘两位数的情况在进行判断
//步骤如下:①确定abc和de--这就是那个五重循环 ②判断x,y,z是否满足要求
//注意,输入时,输完数字,要ctrl+Z 再按回车才能输入
#include<stdio.h>
int IsIn(int x, int array[], int n);
int main()
{
int a, b, c, d, e, n = 0, count = 0, array[10];
for(int i=0; ; i++)
{
if(scanf("%1d", &array[i])) n++;
else break;
}
for(int i=0; i<n; i++)
{
if(array[i]) a = array[i];
else continue;
for(int j=0; j<n; j++)
{
b = array[j];
for(int k=0; k<n; k++)
{
c = array[k];
for(int s=0; s<n; s++)
{
if(array[s]) d = array[s];
else continue;
for(int t=0; t<n; t++)
{
e = array[t];
int x = (100*a + 10*b + c) * e;
int y = (100*a + 10*b + c) * d;
int z = (100*a + 10*b + c) * (10*d + e);
if(IsIn(x, array, n) && IsIn(y, array, n) && IsIn(z, array, n))
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", 100*a+10*b+c, 10*d+e, x, y, z);
/*
printf(" %d", 100*a+10*b+c);
printf("X %d\n", 10*d+e);
printf("-----\n");
if(!x) printf(" 0\n");
else
{
if(x / 1000 == 0) printf(" %d\n", x);
else printf(" %d\n",x);
}
if(y / 1000 == 0) printf(" %d\n", y);
else printf("%d\n",y);
printf("-----\n");
if(z / 10000 == 0) printf(" %d\n", z);
else printf("%d\n", z);
printf("\n");
*/
}
}
}
}
}
}
printf("The number of solution is %d", count);
return 0;
}
int IsIn(int x, int array[], int n)
{
int split[5], flag = 0;
split[0] = array[0];
split[1] = array[1];
if((x % 100) && (x / 1000 == 0))
{
split[2] = x / 100; split[3] = x / 10 % 10; split[4] = x % 10;
}
else if((x % 1000) && (x / 10000 == 0))
{
split[1] = x / 1000; split[2] = x / 100 % 10; split[3] = x / 10 % 10; split[4] = x % 10;
}
else
{
split[0] = x / 10000; split[1] = x / 1000 % 10; split[2] = x / 100 % 10; split[3] = x / 10 % 10; split[4] = x % 10;
}
for(int i=0; i<5; i++)
{
flag = 0;
for(int j=0; j<n; j++)
{
if(split[i] == array[j]) {flag = 1; break;}
}
if(flag == 0) return 0;
}
return 1;
}
//思路一,方法二
//用字符串实现,由于库中有不少字符串函数,所以代码整体简洁了许多,但是总的思想不变
#include<stdio.h>
#include<string.h>
int main()
{
char str[11], buf[25];
scanf("%s", str);
int n = strlen(str), a, b, c, d, e, count = 0;
for(int i=0; i<n; i++) //五个嵌套循环,作用是获得abcde
{
if(str[i] - '0') a = str[i] - '0'; //因为str[i]是个字符型数字,要想获得原本的数字,
//需要-‘0’,不减‘0’得到的是数字对应的ASCII码
else continue;
for(int j=0; j<n; j++)
{
b = str[j] - '0';
for(int k=0; k<n; k++)
{
c = str[k] - '0';
for(int s=0; s<n; s++)
{
if(str[s]-'0') d = str[s] - '0';
else continue;
for(int t=0; t<n; t++)
{
e = str[t] - '0';
int ok = 1;
int x = (100*a + 10*b + c) * e;
int y = (100*a + 10*b + c) * d;
int z = (100*a + 10*b + c) * (10*d + e);
sprintf(buf, "%d%d%d%d%d", x, y, z, 100*a+10*b+c, 10*d+e);
//该函数的作用是:将想向屏幕输出的内容原封不动,从地址buf开始,输入到buf[]数组中,
//并将内容原封不动转化为字符串,不需要转化成ASCII
//所以常用sprintf来把整数打印到字符串中
for(int m=0; m<strlen(buf); m++)
{//看buf中的字符(也就是竖式中出现的所有数字)是否都在str[]中
if(strchr(str, buf[m]) == NULL) {ok = 0; break;}
//strchr()作用是判断某个字符是否在字符串中
}
if(ok)
{
printf("<%d>\n", ++count);
printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n", 100*a+10*b+c, 10*d+e, x, y, z);
}
}
}
}
}
}
printf("The number of solution is %d", count);
return 0;
}
//思路二,方法一
//思路:穷举出所有三位数乘两位数的情形,判断是否符合条件
//代码很简单,就不写了
程序运行截图如下:
在强调一下本题中需要注意的地方,严格来说所给代码中思路一,方法一是不符合要求的,因为需要ctrl+z enter才能实现输入,这是因为,但用scanf()从键盘中获得位置数目的数据时(也就是用while(scanf() != EOF),windows下必须使用上述方式告诉系统输入结束。但是 采用文件输入时就比较方便了,这里只是提供一种思路,在采用数组的方法中,也锻炼了数字处理的能力
再者,就是学习了几个字符处理函数sprintf()和strchr()
sprintf(buf,"",参数表)的作用就是,将""内的内容不转化为ASCII而原样输入从buf地址开始的连续空间,并将这些内容转化为字符型,常用于把整数打印到字符串中
strchr(str, ch)作用就是在一个字符串中查找单个字符,返回第一次出现的地址
上一篇: 二分图最大权值完美匹配 hdu2255
下一篇: 浅谈螺旋队列
推荐阅读
-
连接wifi提示“身份验证出现问题”解决方法
-
Android Studio卡很久(loading)的问题解决办法
-
HTML5实现简单图片上传所遇到的问题及解决办法
-
完美解决Jpush[获取sdk版本失败!]的问题
-
分享29个基于Bootstrap的HTML5响应式网页设计模板
-
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
-
Android在layout xml中使用ViewStub完成动态加载问题
-
android图像绘制(二)画布上放大缩小问题
-
Android中父View和子view的点击事件处理问题探讨
-
Intel HAXM为Android 模拟器加速解决模拟器运行慢的问题