要求完成下面的表达式
a b c d e
+2 0 0 8 5
------------
f g h i j
其中2008表示2008年在北京举办奥运会,
5表示奥运五环,所以合起来20085刚好表示2008奥运。
要求abcdefghij分别表示从0到9的一位数字,而且不允许重复使得上面的加法表达式成立.
最后将所有满足条件的j从小到大连在一起 最后将j输出
怎么编啊?
还有哪位能给小弟说一点学习语言的经验啊,不胜感激!
E-mail:pengzhile@126.com
谢谢!
14 个解决方案
#1
#include <stdio.h>
#include <string.h>
#define MIN 10234
#define MAX 96543
int chanel(int n[],int i);
void output(int a,int b);
int main()
{
int flag[10];
int i,j;
for (i=10234; i<=98765; i++)
{
memset(flag,0,10*sizeof(int));
if (chanel(flag,i))
{
if ( i+20085<=96543 )
{
if ( chanel(flag,i+20085))
{
output(i,i+20085);
}
}
}
}
}
int chanel(int n[],int i)
{
int base=10000;
while (base>0)
{
if ( n[(int)(i/base)]==0 )
{
n[(int)(i/base)]=1;
}
else
{
return 0;
}
i %= base;
base /= 10;
}
return 1;
}
void output(int a,int b)
{
int base=10000;
char c='a';
while ( base>0 )
{
printf("%c=%d ",c,a/base);
c++;
a %= base;
base /= 10;
}
base = 10000;
while ( base>0 )
{
printf("%c=%d ",c,b/base);
c++;
b %= base;
base /= 10;
}
putchar('\n');
}
#include <string.h>
#define MIN 10234
#define MAX 96543
int chanel(int n[],int i);
void output(int a,int b);
int main()
{
int flag[10];
int i,j;
for (i=10234; i<=98765; i++)
{
memset(flag,0,10*sizeof(int));
if (chanel(flag,i))
{
if ( i+20085<=96543 )
{
if ( chanel(flag,i+20085))
{
output(i,i+20085);
}
}
}
}
}
int chanel(int n[],int i)
{
int base=10000;
while (base>0)
{
if ( n[(int)(i/base)]==0 )
{
n[(int)(i/base)]=1;
}
else
{
return 0;
}
i %= base;
base /= 10;
}
return 1;
}
void output(int a,int b)
{
int base=10000;
char c='a';
while ( base>0 )
{
printf("%c=%d ",c,a/base);
c++;
a %= base;
base /= 10;
}
base = 10000;
while ( base>0 )
{
printf("%c=%d ",c,b/base);
c++;
b %= base;
base /= 10;
}
putchar('\n');
}
#2
output
-------------------------------------------------
a=1 b=4 c=9 d=8 e=2 f=3 g=5 h=0 i=6 j=7
a=2 b=7 c=9 d=5 e=1 f=4 g=8 h=0 i=3 j=6
a=3 b=7 c=9 d=4 e=1 f=5 g=8 h=0 i=2 j=6
a=4 b=1 c=9 d=7 e=3 f=6 g=2 h=0 i=5 j=8
a=5 b=1 c=9 d=6 e=3 f=7 g=2 h=0 i=4 j=8
a=6 b=4 c=9 d=3 e=2 f=8 g=5 h=0 i=1 j=7
-------------------------------------------------
a=1 b=4 c=9 d=8 e=2 f=3 g=5 h=0 i=6 j=7
a=2 b=7 c=9 d=5 e=1 f=4 g=8 h=0 i=3 j=6
a=3 b=7 c=9 d=4 e=1 f=5 g=8 h=0 i=2 j=6
a=4 b=1 c=9 d=7 e=3 f=6 g=2 h=0 i=5 j=8
a=5 b=1 c=9 d=6 e=3 f=7 g=2 h=0 i=4 j=8
a=6 b=4 c=9 d=3 e=2 f=8 g=5 h=0 i=1 j=7
#3
帮楼上顶
#4
你有没有少了什么啊?
编译过后能运行,但得出的结果不 能用啊
编译过后能运行,但得出的结果不 能用啊
#5
怎么不能用法?
#6
最后将所有满足条件的j从小到大连在一起 最后将j输出
#7
我昏迷了 我那是打印出所有符合
a~j的组数 没看output吗
你是要交作业吗 看都不看就拿去用了
a~j的组数 没看output吗
你是要交作业吗 看都不看就拿去用了
#8
是这样的,我在玩一个黑客游戏,现在要进入第7关,过的方法我已经知道了 ,只不过要算出J才能继续下去,而你输出的J不行啊
#9
TO :SAMUELKEVIN 你能教我一些学习语言的经验吗?
#10
#include <iostream.h>
bool isRepeated(int xx[10],int n)
{
int m;
while(n)
{
m=n%10;
if( xx[m]!= -1)// 出现了重复的数字
return true;
xx[m]=m;
n=n/10;
}
return false;
}
int cacl20085()
{
int xx[10];
int i;
for(i=98765;//最大的和只可能是98765
i-20085>=12345;//最小的和只可能是12345+20085
--i)
{
for(int k=0;k<10;k++)//数组置标志
{
xx[k]=-1;
}
if(!isRepeated(xx,i) && !isRepeated(xx,i-20085))
{//和i与加数i-20085均在数字位上没有发生重复
cout<<i-20085<<"+20085="<<i<<endl;
}
}
return 0;
}
int main()
{
cacl20085();
return 0;
}
#11
to:a_b_c_abc cpp1.cpp(31) : error C2059: syntax error : '<'
#12
编译是语法错误啊
#13
输出:
64932+20085=85017
51963+20085=72048
41793+20085=62058
37941+20085=58026
27951+20085=48036
14982+20085=35067
所有j连在一起是667788,与SamuelKevin((曼陀罗)一样,不过贴出晚了,不要给分。
64932+20085=85017
51963+20085=72048
41793+20085=62058
37941+20085=58026
27951+20085=48036
14982+20085=35067
所有j连在一起是667788,与SamuelKevin((曼陀罗)一样,不过贴出晚了,不要给分。
#14
mark
#1
#include <stdio.h>
#include <string.h>
#define MIN 10234
#define MAX 96543
int chanel(int n[],int i);
void output(int a,int b);
int main()
{
int flag[10];
int i,j;
for (i=10234; i<=98765; i++)
{
memset(flag,0,10*sizeof(int));
if (chanel(flag,i))
{
if ( i+20085<=96543 )
{
if ( chanel(flag,i+20085))
{
output(i,i+20085);
}
}
}
}
}
int chanel(int n[],int i)
{
int base=10000;
while (base>0)
{
if ( n[(int)(i/base)]==0 )
{
n[(int)(i/base)]=1;
}
else
{
return 0;
}
i %= base;
base /= 10;
}
return 1;
}
void output(int a,int b)
{
int base=10000;
char c='a';
while ( base>0 )
{
printf("%c=%d ",c,a/base);
c++;
a %= base;
base /= 10;
}
base = 10000;
while ( base>0 )
{
printf("%c=%d ",c,b/base);
c++;
b %= base;
base /= 10;
}
putchar('\n');
}
#include <string.h>
#define MIN 10234
#define MAX 96543
int chanel(int n[],int i);
void output(int a,int b);
int main()
{
int flag[10];
int i,j;
for (i=10234; i<=98765; i++)
{
memset(flag,0,10*sizeof(int));
if (chanel(flag,i))
{
if ( i+20085<=96543 )
{
if ( chanel(flag,i+20085))
{
output(i,i+20085);
}
}
}
}
}
int chanel(int n[],int i)
{
int base=10000;
while (base>0)
{
if ( n[(int)(i/base)]==0 )
{
n[(int)(i/base)]=1;
}
else
{
return 0;
}
i %= base;
base /= 10;
}
return 1;
}
void output(int a,int b)
{
int base=10000;
char c='a';
while ( base>0 )
{
printf("%c=%d ",c,a/base);
c++;
a %= base;
base /= 10;
}
base = 10000;
while ( base>0 )
{
printf("%c=%d ",c,b/base);
c++;
b %= base;
base /= 10;
}
putchar('\n');
}
#2
output
-------------------------------------------------
a=1 b=4 c=9 d=8 e=2 f=3 g=5 h=0 i=6 j=7
a=2 b=7 c=9 d=5 e=1 f=4 g=8 h=0 i=3 j=6
a=3 b=7 c=9 d=4 e=1 f=5 g=8 h=0 i=2 j=6
a=4 b=1 c=9 d=7 e=3 f=6 g=2 h=0 i=5 j=8
a=5 b=1 c=9 d=6 e=3 f=7 g=2 h=0 i=4 j=8
a=6 b=4 c=9 d=3 e=2 f=8 g=5 h=0 i=1 j=7
-------------------------------------------------
a=1 b=4 c=9 d=8 e=2 f=3 g=5 h=0 i=6 j=7
a=2 b=7 c=9 d=5 e=1 f=4 g=8 h=0 i=3 j=6
a=3 b=7 c=9 d=4 e=1 f=5 g=8 h=0 i=2 j=6
a=4 b=1 c=9 d=7 e=3 f=6 g=2 h=0 i=5 j=8
a=5 b=1 c=9 d=6 e=3 f=7 g=2 h=0 i=4 j=8
a=6 b=4 c=9 d=3 e=2 f=8 g=5 h=0 i=1 j=7
#3
帮楼上顶
#4
你有没有少了什么啊?
编译过后能运行,但得出的结果不 能用啊
编译过后能运行,但得出的结果不 能用啊
#5
怎么不能用法?
#6
最后将所有满足条件的j从小到大连在一起 最后将j输出
#7
我昏迷了 我那是打印出所有符合
a~j的组数 没看output吗
你是要交作业吗 看都不看就拿去用了
a~j的组数 没看output吗
你是要交作业吗 看都不看就拿去用了
#8
是这样的,我在玩一个黑客游戏,现在要进入第7关,过的方法我已经知道了 ,只不过要算出J才能继续下去,而你输出的J不行啊
#9
TO :SAMUELKEVIN 你能教我一些学习语言的经验吗?
#10
#include <iostream.h>
bool isRepeated(int xx[10],int n)
{
int m;
while(n)
{
m=n%10;
if( xx[m]!= -1)// 出现了重复的数字
return true;
xx[m]=m;
n=n/10;
}
return false;
}
int cacl20085()
{
int xx[10];
int i;
for(i=98765;//最大的和只可能是98765
i-20085>=12345;//最小的和只可能是12345+20085
--i)
{
for(int k=0;k<10;k++)//数组置标志
{
xx[k]=-1;
}
if(!isRepeated(xx,i) && !isRepeated(xx,i-20085))
{//和i与加数i-20085均在数字位上没有发生重复
cout<<i-20085<<"+20085="<<i<<endl;
}
}
return 0;
}
int main()
{
cacl20085();
return 0;
}
#11
to:a_b_c_abc cpp1.cpp(31) : error C2059: syntax error : '<'
#12
编译是语法错误啊
#13
输出:
64932+20085=85017
51963+20085=72048
41793+20085=62058
37941+20085=58026
27951+20085=48036
14982+20085=35067
所有j连在一起是667788,与SamuelKevin((曼陀罗)一样,不过贴出晚了,不要给分。
64932+20085=85017
51963+20085=72048
41793+20085=62058
37941+20085=58026
27951+20085=48036
14982+20085=35067
所有j连在一起是667788,与SamuelKevin((曼陀罗)一样,不过贴出晚了,不要给分。
#14
mark