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语言难题的主要内容,如果未能解决你的问题,请参考以下文章

c语言整形存储的难题解析

用Go语言解决现代编程难题

C语言开发经验

玖哥乱弹编程语言间的斗争

malloc函数详解 C语言逻辑运算符

关于C语言的问卷调查