Math,Logic,Rand
四則運算 + - * / %,邏輯運算,隨機取值
RAND_MAX = 32767、rand():0~32767
RAND_MAX = 32767、rand():0~32767
#include<iostream>
#include<cmath>
main(){
int x,y;
printf ("請輸入兩個整數:");
scanf ("%d%d",&x,&y);
printf ("x+y=%d\n",x+y);
printf ("x-y=%d\n",x-y);
printf ("x*y=%d\n",x*y);
printf ("x/y=%d\n",x/y);
system ("pause");
return 0;
}
※四則運算的加、減、乘都不會有問題,因為結果一定也是整數。
※除法就不是了,整數除以整數、其結果還是整數,這點請切實記住。
想要有小數點的方法是:除數、被除數中,必須至少有一個是浮點數,其結果才會帶有小數點。
解法:
另外宣告一個有小數點的變數
float z;
z=x;
printf ("x/y=%f\n",z/y);
※對位字元必須使用有浮點數的%f,否則結果會因為轉換方式不對,而出現錯誤的數字。
定義:整數除法中被除數未被除盡的部分,稱之為餘數。餘數的範圍為0到除數之間、不包含除數。
例如:27除以6、商數為4、餘數為3。
int x=100,y=3;
printf ("x/y=%d\n",x%y);
輸出結果:1,要使用%d。
餘數的重要性質
a、b、c均為自然數。
一、餘數和除數的差的絕對值,要小於除數的絕對值。
二、被除數=除數×商+餘數;
除數=(被除數-餘數)÷商;
商=(被除數-餘數)÷除數;
餘數=被除數-除數×商。
三、若a、b除以c有相同的餘數,則a與b的差就能被c整除。
例如:17和11除以3,餘數皆為2,所以17-11能夠被3整除。
四、a與b之和除以c的餘數(整除以外),會等於a、b分別除以c的餘數之和(或餘數和除以c的餘數)。
例如:23、16除以5的餘數和3+1=4、(23+16)除以5的餘數也會等於4。
注意,當餘數和>除數時,所求餘數等於餘數和再除以c的餘數。例如:23、19除5,餘數和為3+4=7,所以(23+19)/5的餘數=(3+4)/5之餘數。
五、a、b乘積除以c的餘數,等於a、b分別除以c的餘數之積(或是這個積除以c的餘數)。
例如:23、16除以5的餘數,(23+16)/5的餘數積=3×1=3。
C++語言使用%運算子計算餘數,僅限於『整數』除法。
一、整數除以整數
int a=10,b=3,c;
c=a/b; //c=3
printf("%d\n",a-b*c); //output: 1
※a-b*c的運算等同a%b。
小數點取餘數:不能再用%了!C++數學計算,或是使用函數fmod(double,double)。
二、浮點數除以整數,被視為是無解的,例如:11.5%2,可能是1.5(商為整數5餘1.5)、0.1(商微小數5.7餘0.1)、0(商5.75餘0)。
C++數學計算法:利用整數除以整數=整數,商為整數。(就是這個整數資料型態限制了結果)
float a=11.5; int b=2,c=int(a) / b; //c=5
printf("%f\n",a-b*c); //output: 1.500000
或使用函數
printf("%f\n",fmod(a,double(b)); //output: 1.500000
三、整數除以浮點數呢?
C++數學計算法:
#include<iostream>
#include<math.h>
int a=10,c=0; float b=1.5; c=a/b; //c=6
printf("整數a除以符點數b=%f\n",a*1.0-b*c); //output: 1.000000
或使用函數
printf("整數a除以符點數b=%f\n",fmod(double(a),b); //output: 1.000000
四、浮點數除以浮點數:
#include<iostream>
#include<math.h>
float x=11.0,y=1.5,z; int c=x/y; //商為整數c=7
printf("11.0/1.5=%f\n",x-y*c); //output: 0.500000
z=x/y; //商為浮點數z=7.666666...
printf("11.0/1.5=%f\n",x-y*z); //output: 0.000000、趨近於0。
或使用函數
printf("11.0/1.5=%f\n",fmod(a,b)); //output: 0.500000
int x=100,y=3;
printf ("ceil(x/y)=%d\n",ceil(x/y));
輸出結果:34,要使用%d。
int x=100,y=3;
printf ("floor(x/y)=%f\n",floor(x/y));
輸出結果:34,要使用%f,若使用%.0f,形同取整數。
int x=100,y=3;
printf ("(int)(x/y)=%d\n",(int)(x/y));
輸出結果:33,要使用%d,建議這麼用。
int x=19,y=2;
printf ("round(x/y)=%.2f\n",round(x/y));
輸出結果:10.00,要使用%f。
int x=19,y=2;
printf ("(int)(x/y+0.5)=%d\n",(int)(x/y+0.5));
輸出結果:10,要使用%d,因為已經轉成整數。
int x=19,y=2;
printf ("sqrt(x)=%.2f\n",sqrt(x));
輸出結果:4.36,要使用%f,因為可能會有小數。
※也可以使用迴圈回計算開根號後的值。
範例
float x,y;
cout << "請輸入底數:";
cin >> x;
cout << "請輸入指數:" ;
cin >> y;
cout << "值為:" << pow(x,y) << endl ;
※將指數指定為0.5,就是開根號,pow(100,0.5) = 10。
且 and,符號 &
或 or,符號 |
非 not,符號 ~
互斥或 xor,符號 ^
且 &&
或 ||
非 !
srand(time(NULL)); //亂數種子使用時間產生
或 srand((unsigned)time(NULL));
※ RAND_MAX = 32767、rand():0~32767 ※
(max-min+1)*rand() / (RAND_MAX+1.0) + min
公式:max-min+1 , min
使用C語言的表頭檔,依然能夠在Dev C++裡執行。
使用C++的表頭檔,隨機取值由副程式Randint執行。