c语言初学,求解 C语言初学者求解。

C\u8bed\u8a00\u521d\u5b66 \u6c42\u89e3

int pos(int m, int n) {int r = m % n;int c = m / n;n--;if (r > n - r) r = n - r;if (c > n - c) c = n - c;return r > c ? c : r;}void round(char s, int n) {int i = 0;while (i 0 && i % n == 0)printf("\n");printf("%c", s + pos(i, n));i++;}}int main() {round('A', 5);return 0;}

\u9996\u5148\u8fd9\u4e2a\u7a0b\u5e8f\u672c\u8eab\u6ca1\u6709\u9519\u8bef\uff0c\u4f46\u662f\u9700\u8981\u6ce8\u610f\u7684\u4e00\u70b9\u5c31\u662f\uff0c\u5728\u4f60\u8f93\u5165a b \u7684\u503c\u7684\u65f6\u5019\uff0ca\u540e\u9762\u5fc5\u987b\u9a6c\u4e0a\u63a5\u7740\u4e00\u4e2a,\u9017\u53f7\uff0c\u4e14a\u4e0e\u9017\u53f7\u4e4b\u95f4\u4e0d\u80fd\u6709\u5176\u4ed6\u4efb\u4f55\u5b57\u7b26\uff0c\u5305\u62ec\u56de\u8f66\u3002\u5426\u5219\u5c06\u65e0\u6cd5\u83b7\u53d6\u7b2c\u4e8c\u4e2a\u503c\u3002
\u6bd4\u5982 \u8f93\u5165 5,8 \u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u4f46 \u5982\u679c\u4f60\u8f93\u5165\u7684\u662f5 ,8\u7684\u8bdd\uff085\u548c,\u4e4b\u95f4\u6709\u4e2a\u7a7a\u683c\uff09\uff0c\u5219\u65e0\u6cd5\u5c068\u8d4b\u503c\u5230b\u3002
\u5982\u679c\u4f60\u4e0d\u60f3\u8fd9\u4e48\u9ebb\u70e6\u7684\u8bdd\uff0c\u53ef\u4ee5\u5728sacnf()\u4e2d\u5c06,\u53bb\u6389\u3002\u4fee\u6539\u4e3a\uff1a
scanf("%d%d",&a,&b); //\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u90a3\u79cd\u9650\u5236\u4e86

一般用gets读入一行,再用字符串处理为s1、s2、s3三个字符串,或者scanf("%s%s%s", s1,s2,s3)直接读入;

然后第一步是找出op,测试两次:

如果 s1 在 “+-*/”中,那么 op=s1;x=s2;y=s3;
如果 s2 在 “+-*/”中,那么 op=s2;x=s1;y=s3;
否则 op=s3;x=s1;y=s2;

接下来你会处理了吧,switch(op[0]) 输出x +(或者-*/) y的结果



这是由于浮点数误差导致的。其根本原因是计算机所使用二进制01代码无法准确表示某些带小数位的十进制数据。我们知道将一个十进制数值转换为二进制数值,需要通过下面的计算方法:
1. 整数部分:连续用该整数除以2,取余数,然后商再除以2,直到商等于0为止。然后把得到的各个余数按相反的顺序排列。简称"除2取余法"。
2. 小数部分:十进制小数转换为二进制小数,采用"乘2取整,顺序排列"法。用2乘以十进制小数,将得到的整数部分取出,再用2乘余下的小数部分,然后再将积的整数部分取出,如此进行,直到积中的小数部分为0或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,即先取出的整数部分作为二进制小数的高位,后取出的整数部分作为低位有效位。简称"乘2取整法"。
3. 含有小数的十进制数转换成二进制,整数、小数部分分别进行转换,然后相加。

这导致了一个显而易见的问题:有些十进制数无法转换为有限的二进制数:

(0.65)10 = (0.101001100110011001100110011001100110011......)2
(0.6) 10 = (0.10011001100110011001100110011001100110011......)2

后面的省略号表示已经算不完了,后面在无限重复 0011 这段二进制数值

目前计算机上存储浮点数值是按照IEEE(电气和电子工程师协会)754浮点存储格式标准来存储的。
IEEE单精度浮点格式共32位,包含三个构成字段:23位小数f,8位偏置指数e,1位符号s。将这些字段连续存放在一个32位字里,并对其进行编码。其中0:22位包含23位的小数f; 23:30位包含8位指数e;第31位包含符号s。如下图所示:

也就是说上面将0.65及0.5转换出的二进制代码,我们只能存储23位,即使数据类型为double,也只能存储52位,这样大家便能看出问题出现的原因了。

可惜的的是我们无法从根本上解决问题,除非你能发明十进制计算机,但我们可以曲线救国:

  1. 因为二进制数值可以准确表示整数(可以使用整数转换为二进制方法验证下),所以可以将小数乘以10或100等变成整数,然后做整数运算,最后再通过除以10或100等获得结果;
    2. 通过截取结果的有效小数位数等,来取得最好的近似结果,然后在做处理。
    3. 对于可以用有限长度的二进制数值表示的十进制数值,可以使用存储位数大于其长度的数据类型。

参考CNSD



#include<stdio.h>

int main()
{
char str[32];
long x,y;

scanf("%s",str);
if(!(str[0]>='0' && str[0]<='9'))
scanf("%ld %ld",&x,&y);
else
{
x=atol(str);
scanf("%s",str);
if(!(str[0]>='0' && str[0]<='9'))
scanf("%ld",&y);
else
{
y=atoi(str);
scanf("%s",str);
}
}
switch(str[0])
{
case '+':
printf("%ld\n",x+y);
break;
case '-':
printf("%ld\n",x-y);
break;
case '*':
printf("%ld\n",x*y);
break;
case '/':
if(0!=y)
printf("%ld\n",x/y);
else
printf("除数不能为0!\n");
break;
default:
printf("非法的运算符%s!\n",str);
break;
}
return 0;
}

  • C璇█鍒濆鑰呰闂繖閬撻鎬庝箞鍋?
    绛旓細閬嶅巻瀛楃涓睸锛屼娇鐢ㄦ暟缁勭粺璁″叾涓26涓瓧姣嶅垎鍒嚭鐜扮殑娆℃暟 鏈缁堟渶灏戠殑瀛楁瘝鍑虹幇娆℃暟鍗充负鍙互鍙敜鐨勭榫欐暟 鍐嶄箻浠灏辨槸鍙互瀹炵幇鐨勬効鏈涙暟 C璇█鍙傝冧唬鐮佸涓嬶細include <stdio.h> int main(){ long long int n; // 娉ㄦ剰n鐨勫彇鍊艰寖鍥磋秴杩囦簡2^31-1锛屽簲鍙栭暱鏁村瀷 scanf("%lld", &n);char S[1000000];s...
  • C璇█鍒濆 姹傝В
    绛旓細浠ヤ笅鏄粡杩囦慨鏀瑰悗鐨勭▼搴忥紝閲囩敤8涓瓧绗﹀骞跺彸瀵归綈銆傚彲鐩存帴澶嶅埗銆佺紪璇戝嵆鍙俰nclude <stdio.h> int main(void){ int i=1,j,s,k;while(i<10){ for(j=i++;j<10;j++){ s=(i-1)*j;printf("%8d",s);} printf("\n");for(k=1;k...
  • C璇█鍒濆鑰,鍑犱釜绠鍗曢棶棰,姹傝В閲!
    绛旓細鍏堣1 while(x<15) y++,x+=++y;杩欓噷涓棿鐨勬槸閫楀彿锛浠h〃y++,x+=++y;鏄竴涓鍙ワ紝鐢变簬浼樺厛鍏崇郴锛屾墍浠ュ厛++y锛岀劧鍚庢槸y++,鐒跺悗鏄痻=x+y,杩欐牱鐨勮瘽锛屼竴娆″惊鐜互鍚庯紝x=2锛寉=2锛岀劧鍚庢瘡娆″惊鐜悗锛寉閮戒細鍔2锛寈鍔犱笂涓婁竴娆$殑y+2,杩欐牱锛岀浜屾锛寈=6,y=4,绗笁娆★紝x=12,y=6,绗洓娆★紝x=20...
  • C璇█鍒濆 姹傝В
    绛旓細include <stdio.h>int main() {int i,t,a[4],min,max;for(i = 0; i < 4; ++i) {scanf("%d",&a[i]);}min = max = 0;for(i = 0;i < 4;++i) {if(a[i] > a[max]) max = i;if(a[i] < a[min]) min = i;}if(min != 0) {t = a[0];a[0] = a[...
  • C璇█缂栫▼鍒濆闂
    绛旓細锛1锛夌▼搴忚緭鍑猴細c1=a;c2=b;c1=97;c2=98;鍥犱负锛氫綘鐢%c锛灏辨槸浣犺杈撳嚭涓涓瓧绗︼紝97鐨刟scii鐮佸氨鏄皬鍐欏瓧姣峚锛98涓篵锛涳紙2锛夊鏋滀綘鎶奵1=197锛宑2=198锛屽簲璇ヤ細鎻愮ず闅愬紡杞崲鍚э紝濡傛灉瀹氫箟char c1,c2锛岄粯璁や负鏈夌鍙风殑char鍨嬶紝鍙栧艰寖鍥翠负-128锝127锛屽洜姝よ緭鍑虹殑鏄197-256=-59,198-256=-58锛岃矊浼肩敤...
  • 鍒濆鑰呮眰鏁欑畝鍗曠殑C璇█闂?
    绛旓細闂1锛氬皢case 1锛 case 2锛 case 3 渚濇鏀逛綔case '1',case '2', case '3'灏卞ソ浜嗐傚洜涓簊canf("%c",&choice)锛涜繖鍙ヨ〃绀篶hoice鏄互瀛楃褰㈠紡鎺ユ敹杈撳叆鐨勬暟鎹紝鎵浠ase鐨勫舰寮忓簲璇ヤ篃鏄瓧绗︾殑褰㈠紡锛乧ase閮ㄥ垎濡備笅淇敼灏卞ソ浜 scanf("%c",&choice)while(choice!=鈥4鈥){ scanf("%c",&choice)swit...
  • 鍒濆鑰C璇█闂...
    绛旓細2 2 0 5 3 1 6 7 1 杩欎釜棰樼洰涓昏鑰冪偣鏄++i鍜宨++鐨勫尯鍒++i鏄湪鐢ㄥ弬鏁板墠鍏堝姞1锛岃宨++鏄敤浜嗕箣鍚庡啀鍔1銆倄=1;y=2;z=3;z=++x%y;缁忚繃杩愮畻鍚庯紝z=2%2=0,鑰寈璐h鍔犱竴锛寈=2,y涓嶅彉锛寉=2;杩欎釜鏃跺 x=2;y=2;z=0;涓嬮潰杩涜濡備笅杩愮畻锛寈=x+(z++ + ++y);z...
  • C璇█鍒濆鑰姹傝В涓涓
    绛旓細3涓敊璇 1锛歠loat a,b,c,s锛宎rea; 鏀逛负 float a,b,c,s,area;2锛 area=sqrt(s(s-a)*(s-b)*(s-c)); 鏀逛负 area=sqrt(s*(s-a)*(s-b)*(s-c));3锛 s=1/2*(a+b+c); 鏀逛负 s=1.0/2*(a+b+c);杩欓噷鎴戣В閲婁竴涓3锛 鍦c璇█涓 int/int 杩樻槸涓 int 鎵浠1/2=0...
  • C璇█鍒濆鑰姹傝В
    绛旓細scanf("%d,%d",&a,&b);浣犺繖涓緭鍏ユ牸寮忥紝灏辫淇濊瘉浜屼釜杈撳叆鐨勫间腑闂寸敤閫楀彿闅斿紑锛屼笉鐒跺氨浼氬嚭闂銆傛渶濂芥敼鎴 scanf("%d%d",&a,&b);杩欐牱鑳戒互绌烘牸鎴栬呭洖杞︽潵鍒嗛殧鏁版嵁 銆備綘鐨勮緭鍏ユ槸涓嶆槸娌″姞閫楀彿鍛紵
  • C璇█缂栫▼闂(鍒濆鑰)
    绛旓細鈶犺緭鍑哄瓧绗﹀垯鐢c锛杈撳嚭鏁板瓧鐢╠锛 杩欐槸瀵圭殑 鈶″鍥 鈶㈡澶勪负浠涔堜笉鐢╥nt锛屽畠涓嶆槸鍙互瀹氫箟鏁存暟鍚楋紝涓轰粈涔堣鐢╟har锛 鍥犱负瀹氫箟鐨勫氨鏄瓧绗︼紝鈥97鈥欏簲璇ユ槸灏忓啓瀛楁瘝a鐨刟sc鐮 鈶e浜嶾101\tbc\n锛岃緭鍑虹粨鏋滀负A bc锛101鍜孉浠涔堣浆鎹㈠叧绯伙紵 澶у啓A鐨刟sc鐮佸氨鏄101(鍏繘鍒)...
  • 扩展阅读:c++语言入门自学 ... 初学者如何学c语言 ... c++编程 ... 电脑编程入门自学教程 ... c++编程适合几岁学 ... c#入门基础知识 ... c语言必背100代码 ... c十十编程要学多久 ... c++在线编程平台 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网