C语言难题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言难题相关的知识,希望对你有一定的参考价值。
输入一个整数n, 从三的零次方开始到三的二十次方中选择几个数 通过加减算数使得其值等于n . 三的每个次方只能用一次.
不懂请追问#include <stdio.h>
#include <string.h>
int main()
__int64 n,m;
int c,jin,bg,i;
int num[21];
while(scanf("%lld",&n)==1)
m = n;
memset(num,0,sizeof(num));
c = 0;
while(n>0&&c<21)
switch(n%3)
case 0:
n/=3;
break;
case 1:
num[c] = 1;
n/=3;
break;
case 2:
num[c] = -1;
n/=3;
n++;
break;
case 3:
n/=3;
n++;
break;
c++;
if(c==21&&n!=0)
printf("No solution.\n");
else
bg = 1;
printf("%lld =",m);
for(i=0;i<21;i++)
if(num[i]==1)
if(!bg) printf(" +");
printf(" 3^%d",i);
bg = 0;
else if(num[i]==-1)
printf(" - 3^%d",i);
bg = 0;
printf("\n");
printf("\n");
参考技术A #include<iostream>
using namespace std;
const int max1=8;
int num;
int store[21];
string mark;
int a[21];
bool ifUsed[21];
void putNumbers(void)
int k=1;
for(int i=0;i<20;++i)
store[i]=k;
k*=3;
int findAnswer(int n,int cur)
if(num==n)
int j=0;
for(;j<cur-1;++j)
cout<<"3^"<<a[j]<<mark[j];
cout<<"3^"<<a[j]<<"="<<n<<endl;
return 0;
if(cur<=max1)
for(int i=0;i<=max1;++i)
if(!ifUsed[i])
int cpy=num;
num+=store[i];
mark[cur-1]='+';
a[cur]=i;
ifUsed[i]=1;
if(!findAnswer(n,cur+1))
return 0;
num=cpy;
num-=store[i];
mark[cur-1]='-';
if(!findAnswer(n,cur+1))
return 0;
ifUsed[i]=0;
num=cpy;
return 1;
int main()
int n;
mark.resize(30);
putNumbers();
cin>>n;
for(int p=max1;p>=0;--p)
memset(a,0,sizeof(a));
memset(ifUsed,0,sizeof(ifUsed));
num=store[p];
a[0]=p;
ifUsed[p]=1;
if(!findAnswer(n,1))
break;
system("pause");
return 0;
能写出来,但到9已经够慢了。 参考技术B #include<iostream>
using namespace std;
const int max1=8;
int num;
int store[21];
string mark;
int a[21];
bool ifUsed[21];
void putNumbers(void)
int k=1;
for(int i=0;i<20;++i)
store[i]=k;
k*=3;
int findAnswer(int n,int cur)
if(num==n)
int j=0;
for(;j<cur-1;++j)
cout<<"3^"<<a[j]<<mark[j];
cout<<"3^"<<a[j]<<"="<<n<<endl;
return 0;
if(cur<=max1)
for(int i=0;i<=max1;++i)
if(!ifUsed[i])
int cpy=num;
num+=store[i];
mark[cur-1]='+';
a[cur]=i;
ifUsed[i]=1;
if(!findAnswer(n,cur+1))
return 0;
num=cpy;
num-=store[i];
mark[cur-1]='-';
if(!findAnswer(n,cur+1))
return 0;
ifUsed[i]=0;
num=cpy;
return 1;
int main()
int n;
mark.resize(30);
putNumbers();
cin>>n;
for(int p=max1;p>=0;--p)
memset(a,0,sizeof(a));
memset(ifUsed,0,sizeof(ifUsed));
num=store[p];
a[0]=p;
ifUsed[p]=1;
if(!findAnswer(n,1))
break;
system("pause");
return 0;
参考技术C 运行结果是x=4,若你想屏幕上看到这结果,那就在这些语句后面加上这一句:printf("x=%d",x);
你好象不知道if语句的用法,介绍如下:
if(表达式)
语句1
else
语句2;
if语句执行过程:先计算表达式的值,若表达式的值为“真”(何为真?就是if后面括号里的值只要不是0,就是“真”),若为表达式为“假”(表达式的值为0),则执行语句2。
再来看你的程序,首先你定义了,a、b、c为0,x=35。再接着是
if(!a)x--;
else if(b);
if后面括号内是!a,前面定义了a=0,所以括号内值为“假”,便执行else后的语句x--,x减1等于34。
再看第二个if语句
if(c) x=3;
else x=4;
if(c),c在前面定义了c=0,所以括号里为“假”,执行else后面的语句x=4 ,这里给x重新赋值使x=4,所以最后的x等于4
前面x等于多少不管,这后面x重新定了个值x=4
希望上面的答案对你有用,若有用,请将分数给我
CSDN|每日一练c++难题-大数加法
目录
运行结果
题目描述
大数一直是一个c语言的一个难题。 现在我们需要你手动模拟出大数加法过程。 请你给出两个大整数加法结果。
输入描述:
第一行输入整数n,第二行输入整数m。 (1<=number<=1e100)
输出描述:
输出两数加和。
示例
代码
完整代码
以上是关于C语言难题的主要内容,如果未能解决你的问题,请参考以下文章