问题 B: 此题乃神题,劝你别做
时间限制: 1 Sec 内存限制: 128 MB 提交: 138 解决: 8 [ ][ ][ ]题目描写叙述
声明:这道题没有涉及不论什么算法!给定函数f = (1) + (2) * b + (3) * c + (4) * d + (5)。
输入
输入数据有多组。 每组数据有5个整数,分别相应函数f 中(1)、(2)、(3)、(4)、(5)。
输出
输出f的表达式。详细看给出的例子输出,不要有多余的符号。
例子输入
2 3 -3 4 -51 2 3 -4 52 0 2 2 2
例子输出
2+3b-3c+4d-51+2b+3c-4d+52+2c+2d+2
提示
代码:
//总结:这样的题首先要分两种情况:带不带字母 。还得注意。第一个数 是正数的时候,不用输出+。
//当是字母的时候看看有没有系数为1(或者-1)的项,假设有系数为1(或者-1)的项,那个系数就不用输出了 //然后得看系数是正还是负,假设是负的话。就不用管了,就直接将那一项输出即可了。假设是正的话。还得 //考虑是否输出正号。假设前面的系数都是0。那正号就不用输出了,假设有数,就得输出正号! //还得考虑当全部的系数都是0,那就仅仅能输出0了; //注意:1.字母的系数1(-1仅仅输出负号)不输出。数的话1要输出。 // 2.正号是否输出!
(前面的系数都是0或者是第一项的话就不用输出) // 3.当全部的项都是0的话,不能没有输出!要输出0! // 4.注意数的大小(在hpuoj仅仅能用long long),32位不能满足就仅仅能用long long型来定义了!
#include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; int main() { long long a,b,c,d,e; while(scanf("%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e)!=EOF)//要用long long型进行定义!
{ if(a!=0)//必须推断是否为0,假设是0,则不用输出,否则必须输出 printf("%lld",a); if(b<0)//对后面的数要正负分情况讨论,假设为负数不用输出正号。直接将数输出来即可了 {//可是,又一个问题来了。要是是-1的话,连1都不用输出了,直接输出-b即可了。 if(b==-1) printf("-b"); else//否则得输出那个负数 printf("%lldb",b); } else if(b>0) { if(a!=0)//假设是正数,而且前面有数的话,才干加正号 { printf("+"); } if(b==1)//得推断系数是否是1,是1的话就不用输出1了! printf("b"); else//要是不是1的话。就得将正数输出 printf("%lldb",b); } if(c<0)//c,d和b事实上是一样的,在前面的系数是负数的时候,得分情况输出,看看是-1不是。是-1的话1就不用输出了 {//否则全部的数都得输出! if(c==-1) printf("-c"); else printf("%lldc",c); } else if(c>0)//当为正数的时候,你不但要考虑前面的是否为1,1不输出,并且得考虑正好是否输出。仅仅有前面有数的时候正号才输出! { if(a||b) printf("+"); if(c==1) printf("c"); else printf("%lldc",c); } if(d<0) { if(d==-1) printf("-d"); else printf("%lldd",d); } else if(d>0) { if(a||b||c) printf("+"); if(d==1) printf("d"); else printf("%lldd",d); } if(e<0)//最后一个是数。而不带字母。所以是正负1都得输出! printf("%d",e); else if(e>0) { if(a||b||c||d)//可是正1的时候你的正号得推断,假设前面没有数的话。正号就不用输出了!
printf("+"); printf("%lld",e); } if(!a&&!b&&!c&&!d&&!e)//假设前面的数的系数都是0的话就输出最后的结果为0!
printf("0"); printf("\n");//最后记住换行 } return 0; }
注意:这道题我做的思想没有错。就是用long long会出现输入1 0 0 0 0而输出a+0b+0c+0d的现象,你把long long换成__int64再试试,就对了!
代码:
//总结:这样的题首先要分两种情况:带不带字母 。还得注意,第一个数 是正数的时候,不用输出+。//当是字母的时候看看有没有系数为1(或者-1)的项。假设有系数为1(或者-1)的项,那个系数就不用输出了//然后得看系数是正还是负,假设是负的话。就不用管了。就直接将那一项输出即可了,假设是正的话,还得//考虑是否输出正号。假设前面的系数都是0,那正号就不用输出了。假设有数,就得输出正号。//还得考虑当全部的系数都是0,那就仅仅能输出0了;//注意:1.字母的系数1(-1仅仅输出负号)不输出。数的话1要输出。// 2.正号是否输出!(前面的系数都是0或者是第一项的话就不用输出)// 3.当全部的项都是0的话。不能没有输出!要输出0!
// 4.注意数的大小(在hpuoj仅仅能用long long)。32位不能满足就仅仅能用long long型来定义了。 #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> using namespace std; int main() { __int64 a,b,c,d,e; while(scanf("%I64d%I64d%I64d%I64d%I64d",&a,&b,&c,&d,&e)!=EOF)//要用long long型进行定义。 { if(a!=0)//必须推断是否为0,假设是0。则不用输出。否则必须输出 printf("%I64d",a); if(b<0)//对后面的数要正负分情况讨论,假设为负数不用输出正号,直接将数输出来即可了 {//可是,又一个问题来了。要是是-1的话,连1都不用输出了,直接输出-b即可了! if(b==-1) printf("-b"); else//否则得输出那个负数 printf("%I64db",b); } else if(b>0) { if(a!=0)//假设是正数,而且前面有数的话,才干加正号 { printf("+"); } if(b==1)//得推断系数是否是1,是1的话就不用输出1了!
printf("b"); else//要是不是1的话。就得将正数输出 printf("%I64db",b); } if(c<0)//c,d和b事实上是一样的,在前面的系数是负数的时候。得分情况输出,看看是-1不是。是-1的话1就不用输出了 {//否则全部的数都得输出。 if(c==-1) printf("-c"); else printf("%I64dc",c); } else if(c>0)//当为正数的时候,你不但要考虑前面的是否为1,1不输出。并且得考虑正好是否输出。仅仅有前面有数的时候正号才输出! { if(a||b) printf("+"); if(c==1) printf("c"); else printf("%I64dc",c); } if(d<0) { if(d==-1) printf("-d"); else printf("%I64dd",d); } else if(d>0) { if(a||b||c) printf("+"); if(d==1) printf("d"); else printf("%I64dd",d); } if(e<0)//最后一个是数。而不带字母,所以是正负1都得输出。 printf("%d",e); else if(e>0) { if(a||b||c||d)//可是正1的时候你的正号得推断,假设前面没有数的话。正号就不用输出了! printf("+"); printf("%I64d",e); } if(!a&&!b&&!c&&!d&&!e)//假设前面的数的系数都是0的话就输出最后的结果为0! printf("0"); printf("\n");//最后记住换行 } return 0; }