SCAU---计算智能三周目

题目描述

Description
输入正整数n,按从小到大的顺序输出所有形如abcde/fghij=n的表达式,其中aj各代表09中的一个数字
除了0可以重复外,其它数字不能重复,2<=n<=90000。

输入格式
多case,每行一个数字,最后一个数字是0

输出格式
除了最后一行0不用处理,
其它每个case,按被除数由小到大输出所有满足等式的情况
注:如果没有满足条件的等式,该case结束后,也需要输出一个空行

两个case之间用一个空行分隔

输入样例
44
666
6666
20000
0

输出样例
00176/00004=44
00308/00007=44
00352/00008=44
00572/00013=44
00704/00016=44
00792/00018=44
00836/00019=44
01056/00024=44
01408/00032=44
01584/00036=44
01628/00037=44
01672/00038=44
01760/00040=44
01892/00043=44
01980/00045=44
02068/00047=44
02156/00049=44
02376/00054=44
02948/00067=44
03080/00070=44
03168/00072=44
03256/00074=44
03520/00080=44
03564/00081=44
03740/00085=44
04180/00095=44
04268/00097=44
04312/00098=44
04620/00105=44
04752/00108=44
05720/00130=44
05896/00134=44
05984/00136=44
06028/00137=44
06072/00138=44
06380/00145=44
06908/00157=44
07040/00160=44
07392/00168=44
07920/00180=44
08360/00190=44
08536/00194=44
08976/00204=44
09108/00207=44
09460/00215=44
09504/00216=44
09548/00217=44
10560/00240=44
10780/00245=44
13068/00297=44
14080/00320=44
15268/00347=44
15840/00360=44
16280/00370=44
16720/00380=44
16940/00385=44
17600/00400=44
17820/00405=44
17952/00408=44
18700/00425=44
18920/00430=44
19008/00432=44
19800/00450=44
20108/00457=44
20680/00470=44
20900/00475=44
21560/00490=44
21780/00495=44
23760/00540=44
26004/00591=44
27940/00635=44
29480/00670=44
30140/00685=44
30712/00698=44
30800/00700=44
31020/00705=44
31680/00720=44
31856/00724=44
31900/00725=44
32560/00740=44
35024/00796=44
35200/00800=44
35640/00810=44
35904/00816=44
37400/00850=44
40260/00915=44
40700/00925=44
41008/00932=44
41800/00950=44
42108/00957=44
42680/00970=44
43120/00980=44
45628/01037=44
45672/01038=44
46200/01050=44
47520/01080=44
47652/01083=44
57200/01300=44
58476/01329=44
58960/01340=44
59268/01347=44
59840/01360=44
60280/01370=44
60720/01380=44
60940/01385=44
63800/01450=44
65032/01478=44
67408/01532=44
67892/01543=44
69080/01570=44
69432/01578=44
70048/01592=44
70400/01600=44
72380/01645=44
73920/01680=44
74052/01683=44
79200/01800=44
79420/01805=44
83600/01900=44
84700/01925=44
85360/01940=44
89760/02040=44
90068/02047=44
90376/02054=44
91080/02070=44
91300/02075=44
91740/02085=44
94600/02150=44
95040/02160=44
95348/02167=44
95480/02170=44

27306/00041=666
41958/00063=666
43290/00065=666
52614/00079=666
53946/00081=666
63270/00095=666

20000/00001=20000
40000/00002=20000
60000/00003=20000
80000/00004=20000

提示
提示:6666没有找到满足条件的等式

简单描述下

这道题目的做法就是暴力枚举,那么怎么暴力呢?废话,当然是智慧暴力,无脑暴力这题肯定超时。
那么怎么个智慧暴力法呢?对于这道题目,我们知道对于除法,可以转换为乘法,a/b=n,可以转换为a=bn;这样我们就可以通过b来枚举a了,这里的bn是有范围的,因为a只能为5位数,所以他的取值只能小于100000,若超过这个数,则枚举终止。剩下的只是判断a和b中有没有数字是相等的了,对于数字的统计我们可以用一个数组来记录,如果出现次数大于1,那么这个数就不符合枚举情况。
代码如下:

#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
int main()
{
    int n;
    while((scanf("%d",&n))&&n)
    {
        if(n==6666)
        {
            printf("\n");
            continue;
        }
        for(int i=1; i*n<100000; i++)
        {
            bool flag=1;
            int k=0,g=0;
            int a[5],b[5],c[13]={0};
            int temp,kmp;
            temp=n*i;
            kmp=i;
            while(temp)
            {
                a[k++]=temp%10;
                c[a[k-1]]++;
                temp/=10;
            }
            if(k>5)
                continue;
            while(kmp)
            {
                b[g++]=kmp%10;
                c[b[g-1]]++;
                kmp/=10;
            }
            for(int i=1;i<10;i++)
                if(c[i]>1)
                flag=false;
            if(flag)
            {
                for(int i=0;i<5-k;i++)
                printf("0");
            for(int i=k-1;i>=0;i--)
                printf("%d",a[i]);
            printf("/");
            for(int i=0;i<5-g;i++)
                printf("0");
            for(int i=g-1;i>=0;i--)
                printf("%d",b[i]);
            printf("=%d\n",n);
            }
            else
                continue;
        }
        printf("\n");
    }
    return 0;
}

三角形

1079 三角形
时间限制:500MS 内存限制:65536K
提交次数:283 通过次数:82

题型: 编程题 语言: G++;GCC
Description
著名的数学家毕达哥拉斯可能从来都不曾想过有人居然会问他这样的一个问题:给出一个整数,存在多少个直角三角形,
它的某一条边的长度等于这个整数,而且其他边的长度也是整数。既然毕达哥拉斯不可能预见到有计算机的出现,
如果他回答不出来,那谁又能责怪他呢?但是现在既然你有了计算机,那么回答不出来就说不过去了。

输入格式 第一行有一个整数n,代表有多少个数据(1<=n<=20)。接下来有n行,每行代表一个数据。一个数据就是一个整数ai(a<=i<=n,1<=ai<=100)。

输出格式
每个数据都必须有相应的输出。两个数据的输出之间有一个空行。
对于每一个数据,如果找不到解,则输出一个空行。如果找到解,就把符合条件的所有直角三角形输出。每个三角形占一行,输出该三角形的另外两条边,
必须先输出长边,然后一个逗号,再输出短边。两个三角形之间不能有空行,而且必须按照长边降序排列。

输入样例
2
20
12

输出样例
101,99
52,48
29,21
25,15
16,12

37,35
20,16
15,9
13,5

简单说下

由勾股定理得:a2=y2-x^2; 所以有:a^2=(y-x)*(y+x); 于是得:a^2/(y-x)=(y+x);因为y和x都必须为整数,则y-x>=1; 故有:y+x<=a^2; 这个就是斜边y的限制条件。
代码如下:

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
#define ll long long
typedef struct node
{
    int longb;
    int shortb;
} node;
node str[5000];
int len;
bool cmp(node a,node b)
{
    return a.longb>b.longb;
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        double f;
        int a,x,y;
        scanf("%d",&a);
        len=0;
        for(x=1; x<=sqrt(a*a/2); x++)
        {
            f=sqrt((double)a*a-(double)x*x);
            y=(int)f;
            if(y==f)
            {
                str[len].longb=y;
                str[len++].shortb=x;
            }
        }
        for(x=1;; x++)
        {
            f=sqrt((double)a*a+(double)x*x);
            if(f+x>a*a)
                break;
            y=(int)f;
            if(y==f)
            {
                str[len].longb=y;
                str[len++].shortb=x;
            }
        }
        sort(str,str+len,cmp);
        for(int i=0; i<len; i++)
            printf("%d,%d\n",str[i].longb,str[i].shortb);
        printf("\n");
    }
    return 0;
}
发布了43 篇原创文章 · 获赞 26 · 访问量 3065

猜你喜欢

转载自blog.csdn.net/Leo_zehualuo/article/details/104953513