本文目錄一覽:
c語言的加減乘除是怎麼實現的
本質上都是位運算。 加法通過異或、且和左移遞歸實現。
設a,b為兩個二進制數,則a+b = a^b + (ab)1;
典型的實現代碼:
//遞歸版本的加法
int Add(int a, int b)
{
return b ? Add(a^b, (ab)1) : a;
}
//迭代版本
int Add_iter(int a, int b)
{
int ans;
while(b)
{
ans = a^b;
b = (ab)1;
a = ans;
}
return ans;
}
再用加法和移位就能模擬乘除和減法
減法:a-b = a+(-b)
乘法運算:原理上還是通過加法計算,將b個a相加。
除法運算:除法運算是乘法的逆。看a最多能減去多少個b
求兩個按鍵控制數碼管數字加減C語言程序
void main (void)
{
unsigned char num=0;
KEY_ADD=1; //按鍵輸入端口電平置高
KEY_DEC=1;
while (1) //主循環
{
if(!KEY_ADD) //如果檢測到低電平,說明按鍵按下
{
DelayMs(10); //延時去抖,一般10-20ms
if(!KEY_ADD) //再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY_ADD);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
if(num99) //加操作
num++;
}
}
}
if(!KEY_DEC) //如果檢測到低電平,說明按鍵按下
{
DelayMs(10); //延時去抖,一般10-20ms
if(!KEY_DEC) //再次確認按鍵是否按下,沒有按下則退出
{
while(!KEY_DEC);//如果確認按下按鍵等待按鍵釋放,沒有釋放則一直等待
{
if(num0) //減操作
num–;
}
}
}
TempData[0]=dofly_DuanMa[num/10];//分解顯示信息,如要顯示68,則68/10=6 68%10=8
TempData[1]=dofly_DuanMa[num%10];
Display(0,8); //顯示全部8位
//主循環中添加其他需要一直工作的程序
}
}
/*————————————————
uS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的範圍是
0~255 這裡使用晶振12M,精確延時請使用彙編,大致延時
長度如下 T=tx2+5 uS
————————————————*/
void DelayUs2x(unsigned char t)
{
while(–t);
}
/*————————————————
mS延時函數,含有輸入參數 unsigned char t,無返回值
unsigned char 是定義無符號字符變量,其值的範圍是
0~255 這裡使用晶振12M,精確延時請使用彙編
————————————————*/
void DelayMs(unsigned char t)
{
while(t–)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
/*————————————————
————————————————*/
void Display(unsigned char FirstBit,unsigned char Num)
{
unsigned char i;
for(i=0;iNum;i++)
{
DataPort=0; //清空數據,防止有交替重影
DUAN=1; //段鎖存
DUAN=0;
DataPort=dofly_WeiMa[i+FirstBit]; //取位碼
WEI=1; //位鎖存
WEI=0;
DataPort=TempData[i]; //取顯示數據,段碼
DUAN=1; //段鎖存
DUAN=0;
DelayMs(2); // 掃描間隙延時,時間太長會閃爍,太短會造成重影
}
望採納
}
大一C語言編程問題
判斷迴文程序
char ch[6]=”hello”;
int b=0;
printf(“請輸入一個字符串”);
char in[6];
gets(in);
for(int i=0;i=5/2;i++)
{
if(in[i]==ch[5-i]) //兩個字符數組遍歷並且頭尾比較
b++; //記錄相等的個數
}
if(b==5) //為5時屬於hello整個顛倒寫.
printf(“輸入的字符串是迴文”);
else
printf(“輸入的字符串不是迴文”);
查找字符串中字符的位置
int f(char *s, char *a)
{
int ls,la,i;
int flag = -1;
ls = strlen(s);
la = strlen(a);
if (la ls) return -1;//如果不存在 返回-1
for (i=0;i=ls-la;i++){
if (strncmp(s+i,a,la)==0) return i;
}
return flag;
}
第一道題沒看明白
是加減交替嗎?如果是,思路是這樣的:
int sum = 1;
for(int i=3,i=20,i++)
{
if((i+1)%4 == 0)
{
sum = sum -i;
}
else
{
sum = sum + i;
}
}
return sum;
隨手寫的,只是思路,拼寫也許會有小錯誤,上機如有bug還需你自己調試
初學見諒,這個加法計算器為何只能計算整數
int型數據:-1=(1000,0001B)原=(1111,1110B)反=(1111,1111B)補=(FFH)補。補碼在計算機中進行的運算不同於一般的二進制數運算。他有自己的一套規則。比如加減法:[X+Y]補=[X]補+[Y]補;[X-Y]補=[X]補+[-Y]補,通過雙高位識別法進行溢出判斷。補碼除法分恢復餘數法和加減交替法。乘除法的運算相對於加減法複雜。
C語言中數的運算也有其自己的一套規則,簡單的數是int-float;short-long;的方向轉變。當整型數和整型數運算時得到的一定是個整型數;整型和浮點型數運算現將整型轉化為浮點型數再運算的到的是一個浮點數,若將改浮點數賦值給整型數將會進行強制類型轉換。去掉小數部分而不是四捨五入。
比如:比較下列兩個結果:
#include “stdio.h”
mian()
{int n;
float m,a,b;
printf(“please input two num(a/b).example:100,200”);
scanf(“%f,%f”,a,b);
printf(” fist result:%d\n second result:%f\n”,n=a/b,m=a/b);
}
輸入:-1,2
得到結果:
fist result:0
second result:-0.5000000
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/288720.html