竖式问题

【题目】:

    找出所有形如abc*de(三位整数乘两位整数)的算式,使得在完整的竖式中,所有数字都属于一个特定的数字集合。输入数字集合(相邻数字之间没有空格),输出所有竖式。每个竖式前应有编号,之后应有一个空行。最后输出解的总数。

样例输入:

    2357

样例输出:

    <1>
      775
    X  33
    -----
     2325
    2325
    -----

   25575

    The number of solutions = 1

【分析】

    题目中的两个乘数已知一个是两位数,一个是三位数,则二者乘积一定不会超过5位,计算出结果之后,输出5位数字,左边为0的用空格不齐。

    解决这道题目无非两个思路,一是从所给的数字集合中选择数字组成竖式,而是枚举所有数字组合的乘数,筛去不符合的。看似从较小的数字集合中选取比较节省时间,但是筛选原则不容易确定,在这种情况下,枚举abc和de虽然数量多,但是每次操作都很简单。

#include<stdio.h>
#include<string.h>
int main()
{
    int cou =0;
    char s[20],buf[99];
    scanf("%s",s);
    for(int abc = 111;abc<=999;abc++)
        for(int de =11;de<=99;de++)
    {
        int x=abc*(de%10);
        int y=abc*(de/10);
        int z = abc*de;
        sprintf(buf,"%d%d%d%d%d",abc,de,x,y,z);
        int ok=1;
        for(int i=0;i<strlen(buf);i++)
            if(strchr(s,buf[i])==NULL)
                ok=0;
        if(ok)
        {
            printf("<%d>\n",++cou);
            printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",abc,de,x,y,z);
        }
    }
    printf("The number of solutions = %d\n",cou);
    return 0;
}

sprintf(str2,const  char*  str1)函数将一个字符串str1写进另一个字符串str2,但是由于这个函数没有申明str1的长度,所以有溢出的风险,可以使用snprint()函数来解决,此函数中增加了一个int size的变量,size=strlen(str1)。

    或者用一个可变大小的buffer——Java版:

public static void main(String[] args) {
	int cou=0;
	String s;
	Scanner scanner = new Scanner(System.in);
	s=scanner.next();
	for(int abc=111;abc<=999;abc++)
		for(int de=11;de<=99;de++) {
			StringBuffer stringbuffer = new StringBuffer();
			int x=abc*(de%10),y=abc*(de/10),z=abc*de;
			stringbuffer.append(x);
			stringbuffer.append(y);
			stringbuffer.append(z);
			stringbuffer.append(abc);
			stringbuffer.append(de);
			boolean ok=true;
			for(int i=0;i<stringbuffer.length();i++)
				if(s.indexOf((int)stringbuffer.charAt(i))==-1)
					ok=false;
			if(ok)
			{
				System.out.println("<"+ ++cou +">");
				System.out.printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n",abc,de,x,y,z);
			}
		}
	System.out.printf("The number of solutions = %d\n",cou);
}
如有错误,恳请指出~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值