c语言背包问题 编程里出现bag怎么办?
背包问题应用实例?
背包问题是一个组合优化的NP完全问题。
背包问题可以描述为:给定一组物品,每个物品都有自己的重量和价格。在有限的总重量内,如何选择才能使物品总价最高?
问题的名称来源于如何选择最合适的物品放入给定的背包中。
类似的问题经常出现在商业、组合数学、计算复杂性理论、密码学和应用数学等领域。
背包问题也可以描述为一个决定性问题,即在总重量不超过W的前提下,总价值能否达到V?它是由Merkle和Hellman在1978年提出的。
背包问题已经被研究了一个多世纪。早期的作品可以追溯到数学家托拜厄斯丹齐格(tobias Dancziger)在1897年的早期作品,它指的是在不超载行李的情况下打包你最有价值或最有用的物品这一常见问题。
背包问题的主要思想是假设某人有大量不同重量的物品。
这个人偷偷挑选一些物品放在背包里,加密消息。
背包里物品的总重量是公开的,所有可能的物品也是公开的,但是背包里的物品是保密的。
附加一定的限制,赋予权重,列出可能的项目,在计算上是不可行的。背包问题是一个众所周知的不可计算问题,背包系统以其快速的加解密速度吸引了人们的注意。
但是背包系统大部分都被破译了,所以用的人很少。
编程里出现bag怎么办?
1.目的明确。仔细检查异常报告,确定是否是bug,找出各种有用的信息,找到问题的症结所在。
2.准备工作——找出正确的代码并用排除法清洁工作区域。
3.匹配测试环境。如果客户正在操作计算机配置,则可以跳过此过程。
4.明确代码的用途,确保现有的所有测试工具正常。
c语言新手常见问题?
1.在编写标识符时,大写字母和小写字母之间的差异被忽略。
2.忽略变量的类型,进行非法操作。
3.混淆字符常量和字符串常量。
4.忽略等号和双等号的区别。
5.忘了奖金数字吧。
6.输入变量时忘记添加地址运算符。
7.数据输入方式不符合要求。
8.输入字符的格式不符合要求。
9.输入和输出的数据类型与使用的格式说明符不一致。
1-@qq.com
以下是C语言初学者的常见问题
1.程序屏幕一闪而过。
# include int main(void){ int I signal/*定义表示信号灯状态的变量*/printf (# 34红灯为0,绿灯为1
#34) /*输出提示信息*/scanf (# 34 % d # 34,Ampisignal)/*输入isignal变量*/if(iSignal==1) /*用if语句判断*/{printf (# 34灯为绿色,汽车可以行驶
#34) /* Output */} if当判断结果为真(iSignal==0)/*使用if语句判断*/{printf (# 34灯为红色,carscan # 39T运行
#34) /* Output */}判断结果为真时返回0}
分析:这个程序在XP或以上系统上用win-tc、dev-cpp等ide编译运行时,无论输入什么数字,结果都是一闪而过,因为程序执行完语句直接退出。
解决方案:这里有几个解决方案:
(1):在程序的开头加上#include,然后在程序的结尾加上system(#34pause#34)。
这种方法只适用于MS-DOS,windows,不适用于*nix等系统。
(2):在需要暂停的地方添加一两个get)
这种方法,本质上不是挂起程序,而是让程序等待用户输入几个回车。但是效果和暂停一样。
(3):在程序开头加#include,在需要暂停的地方加一个getch()。原理和上一个差不多。在win-tc中广泛使用。
2.if,for,while判断直接跟随。
例如:
# include int main(void){ int a scanf(# 34 % d # 34,AMPA) if(a==123)///error,if(a==123)不应该加,而应该跟///{ printf()} code { printf(# 34 CCC # 34)} else { printf(# 34 DDD # 34)} return 0 } # include int main(void){ int n,i printf(#34请输入a numbergt2:
#34,n) else printf(#34%d是一个sushu
#34,n)返回0}
解决amp解决方案:参见注释。
3.头文件缺失,main函数格式不规范。
例如:
main(){ int a scanf(#34%d#34,ampa) printf(#34input %d#34,a)}
分析:这个程序没有带头文件stdio.h也就是省略了#include。如果只有scanf,printf函数,stdio.h可以省略,正确运行,但这是一个很不好的习惯。而main()的写法,C89标准勉强允许这种形式,C99标准不允许。
而void main(),到目前为止,还没有标准考虑接受它。但是一些编译器允许这样做。当然,这种写法很受欢迎,应该和老谭的书有很大关系。
解决方案:使用的头文件应该包含在include中。main()函数应该以int main(void)的形式编写,在main()函数的末尾返回0。
也就是
# include int main(void){ int a scanf(# 34 % d # 34,ampa) printf(#34input %d#34,a) return 0}
4.scanf格式控制的误用
例如:
#includeint main(void){ float a,b,c printf(# 34 shuru 3 ge Shu : # 34)scanf(# 34 %f, % f,%f#34,ampa,ampb,ampc) printf(#34he shi %f#34,a b c) return 0}
解析:scanf()函数允许在格式字符串中放置普通字符。除空格字符之外的普通字符必须与输入字符串完全匹配。否则,例如上面的程序,然后scanf()将其解释为,它将键入一个数字,一个逗号,然后一个数字,一个逗号,最后一个数学。也就是说必须这样输入:2.3,5.1,3.8。如果没有完全匹配,scanf()读取将失败。
作为编写这个程序的人,你可以用这种格式输入,但是用户不知道用哪种格式输入。所以应该改成SCANF (# 34 % f % f # 34,AMPA,AMPB,AMPC)
解决方案:请参见scanf行的解析。
5.错误的scanf参数
例如:
# include int main(void){ char str[80]printf(# 34请输入您的名字#34) scanf(#34%s#34,ampstr) printf(#34Hello %s#34,str) return 0}
解析:在scanf()中,读取int、long、float、double、char等数据。需要在第n个参数(ngt=2)上加amp,因为在scanf()函数中,第n个参数(ngt=2)是变量的地址,而不是变量本身:比如定义了int num,scnaf (# 34)
但是读取字符串时不需要加amp,因为字符串本身的变量名就代表了地址。因此,在示例中应该是scanf(#34%s#34,str)。同时,这一规则也适用于结构中的变量,即
struct foo { char chchar str[80]int num }数据
那就应该是
scanf(#34%c%s%d#34、)
解决方法:见分析。
6.数据类型混乱
例如:
# include int main(void){ int A double b=1 for(A=1 alt=6aA)b *=A printf(# 34 % LD # 34,b)}
分析:B定义为双精度浮点型,而输出使用%ld,即长整型,数据类型不一致。输出是:老谭书中关于用TC调试的那一节给出的例子,好像是把int a写到printf (# 34 % f # 34,a)引起的错误。
解决方法:将B定义为long,即long b=1(实际上这里涉及到隐式转换,所以更正确的做法是将A定义为long)
7.C语言中的“除法”
例如:
# include int main(void){ printf(# 34请输入一个华氏温度。
# 34) float a,c scanf (# 34 % f # 34,a)c=5/9 *(a-32)printf(# 34 % 4.2f # 34,c) return 0}
解析:C语言中,两个整数相除。如果它们不能被整除,小数部分会被直接丢弃,即“截断”。所以5/9的结果是0。
解决方法:应该使用类型转换,或者明确定义两个除数的类型。
c=(浮点型)5/9*(a-32)
c=5.0/9*(a-32)
c=5.0/9.0*(a-32)
8.混合输入数字和字符的杯子
# include int main(void){ char ch int num,I printf(# 34输入一个字符和一个整数:
#34) while((ch=get))!=#39
#39) { scanf(#34%d#34,ampnum)for(I=0 I lt num I)putch)put # 39
# 39)printf(# 34输入另一对。空行退出#34) }返回0}
分析:这个程序表面上看起来没什么问题,但实际再次运行时会发现只输入了一组数据,程序就退出了。
开始时,程序运行良好。例如,如果输入2,程序将打印aa。但是,程序在响应第二次输入之前退出。
问题出在换行符上,这次换行符紧接在第一个输入的2之后。scanf()函数将换行符保存在输入队列中,而get)不跳过换行符。所以在循环的下一个循环中,get)读取第一个输入的换行符,换行符是终止循环的条件。
解决方案:在输入流中吃回车键。
在while循环的末尾,添加以下语句
while(获取)!=#39
#39)继续
还可以添加fflush(stdin)来刷新输入流。
9.我,我纠结了
示例:
# include int main(void){ int I=5 printf(# 34 % d % d # 34,I,i ) return 0}
分析:这个问题,在实际编程中,应该没人会写,但还是有很多初学者纠结于此。在编程领域,实践在很多情况下是最好的老师。如果代码有疑问,在电脑上敲一下,重新编译运行,是个不错的办法。但是在I,I方面,这个程序即使编译运行,也不一定有正确的结果。用VC,TC,gcc编译运行后的结果不一定一样。或者从某种角度来说,这里的结果是否正确其实并不重要。
Printf(#34%d %d#34,I,I)这个语句,其中I,I是一个未指定的行为。也就是说,C语言的标准并没有规定这个操作的执行顺序。如果用gcc编译并添加-Wall选项,将会出现警告:
函数#039; main#039;6:24:中的Gcc 2_1.c -o 2_1 -g -Wall2_1.c:警告:对#039; I #039;的操作结果可能未定义。
所以,解决这个问题最好的办法就是不要在程序中写这样的代码。
解决方法:见上文。
10、60lt=等级lt=70
示例:
if(60 lt=grade lt=70)printf(# 34 pass # 34)else if(70 lt=grade lt=85)printf(# 34 good # 34)
:在数学中,表达式60lt=gradelt=70是有效的,但是在C语言中,没有这样的表达式。
解决方案:应该将它重写为
If ((60 lt=等级)amp amp(等级lt=70)) printf (# 34 pass #34)else.
11.switch接受什么值?
示例:
# include int main(void){ double choice scanf(# 34 % lf # 34,amp choice)switch(choice){ case 1.0 : printf(# 341.0 # 34)break case 2.0 : printf(# 342.0 # 34)break default : printf(# 34It # 39s not 1.0或2.0#34) } return 0}
分析:这种问题在实际编程中也是不会出现的。但是有些C语言的题可能会这样出来。Switch()接受整数:整数或字符。所以switch()不接受浮点、字符串等类型。
解决方案:没有他…
12.==的困惑
示例:
Void count(void)/* counter函数*/void show _ count(void)/* Report count result */int main(void){ puts(# 34请输入一些字母3360(# to end)# 34)count()show _ count()puts(# 34感谢您使用本草_茶制作的这个程序!#34)系统(#34pause#34)返回0 } void count(void){ while((ch=get))!=STOP){ if(ch=SPACE){ sp _ count continue } if(ch=ENTER){ n _ count continue } other _ count }/* end of while((ch=get))!=# 39 # # 39)*/} void show _ count(void){ puts(# 34的数量
空格输入other # 34)printf(# 34)mm
#34,sp_count,n_count,other_count)}
分析:换句话说,这个错误是我自己犯的。在数学中,=表示相等,而在很多编程语言中,=表示赋值,==表示相等。惰性导致错误。这个错误C编译器既不会报告错误也不会发出警告。很难检查是否出了问题。
看了二十多遍调试值监控都没找到。最后我一行一行的看了源代码才知道是这个问题。C语言四书五经中的C陷阱与陷阱和专家C编程都提到了这个问题。
解决方法:除了关心什么都不是。
13.溢出问题
举例:求斐波那契数列的前n项。
# include # define N 100 int main(void){ int fib[N]int I fib[0]=fib[1]=1 printf(# 34 % d % d # 34,fib[0],fib[1])for(I=2 I lt N I){ fib[I]=fib[I-1]fib[I-2]printf(# 34 % d # 34,fib[i]) } return 0}
解析:在数学概念中,整数和小数是无限的,但在计算机中,即使是long long int或double类型也有一定的极限,会溢出。
即假设指针式体重秤的最大量程是120KG,那么一个体重130KG的人站起来,指针就会指向10KG的体重秤。同样,溢出。
在C语言中,编译器不会检查或处理溢出。因此,在编程时,您应该自己估计数字的大小,以选择合适的数据类型来表示数据。
PS:由于TC编译的程序是16位的,所以int也是16位的,所以会很容易溢出。
解决方法:一方面使用合适的数据类型,如long、long long或double。另一方面,如果数字大到连无符号的long long int或double都无法表示,那就用数组。但是定义数组的加减是好的,定义乘除就没那么简单了。
所以新人推荐第一种方法。第二种方法,可以考虑自己编个小程序实现。
14.四舍五入?
示例:需要将输入的数字四舍五入到指定的精度并输出。
# include int main(void){ double a=158.385427 printf(# 34 % . 2 lf # 34,a) return 0}
解析:C语言中,printf(#34%.2lf#34,num)直接截断到小数点后两位,类似于零截断而不是四舍五入。
解决方案:如下所示
//对显示的数字进行四舍五入,用户可以准确输入。//区分正负# include # include # include int main(void){ int width double a=158.385427 puts(# 34 ent ER the width # 34)scanf(# 34 % d # 34,amp width)if(AGT 0.0)a=(int)(a * pow(10,width) 0.5)/pow(10,width) else a=(int)(a*pow(10,width) - 0.5)/pow(10,width)printf(# 34t*lf
#34,宽度,a)系统(#34原因# 34)返回0}
15.函数的返回值
示例:
#includedouble salary()/*用于计算工资税的函数*/void main(){ int choice char want 0 double result while(1){ printf(# 34欢迎使用个人所得税计算器
#34) printf(#34
#34) printf(#341。工资薪金所得税的计算
#34) printf(#34
#34) printf(#34,请输入要计算的税目序号:# 34) scanf (# 34 % d # 34,amp choice)if(choice==1){ salary()printf(# 34 % lf # 34,Result)} double sale Result printf(# 34请输入您的薪金:#34) scanf(#34%lf#34,amp sal)if(sallt=3000)Result=# 34 sal # 34 sal=# 34
分析:问题简单来说就是用户自定义函数不返回计算出的值。本质上是关于存储类和链接,也就是变量的作用域、链接和存储周期。
解决方案:
/* * main.c * *创建于: 2011年6月11日*作者3360 ICE */# INCLUDE DOUBLE SALARY()/*用于计算工资税的函数*/int main(void){ int choice//char want0///此want 0变量不使用DOUBLE result while(1){ printf(# 34欢迎使用个人所得税计算器。
#34) printf(#34
#34) printf(#341。工资薪金所得税的计算
#34) printf(#34
#34) printf(#34请输入需要计算的税收项目序号:#34) scanf(#34%d#34,amp choice)if(choice==1){ result=salary()//要有一个值接受返回值才可以printf(#34%lf#34,result)} } } double salary(){ double sal,result printf(#34请输入您的薪水:#34) scanf(#34%lf#34,amps al)if(sallt=3000)result=# 34 sal # 34 sal=# 34 # 34gt 3000 amps allt=4500)result=# 34 sal * 0.05 # 34 sal=# 34 # 34gt 4500 amps allt=7500)result=# 34 sal * 0.1-75 # 34 sal=# 34 # 34gt 7500
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。