循环左{右}位移怎么实现?有具体题目问!
a是系统给定的外部整型变量(不需要自行定义),其值是一个3位十进制数。编写
程序,将a的值循环右移1位。例如,若a=123,则
移位后a=312;若a=360,则移位后a=36。
**********/
void main()
{
}
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
int count(int);
int newnumRight(int, int);
int newnumLeft(int n, int num);
int main(void) {
int num,n,i,numnew;
L:
printf("INPUT NUM: ");
scanf("%d", &num);
if(num<0 || num>INT_MAX) {
printf("INPUT ERROR!\n");
goto L;
}
n=count(num);
printf("\n循环右移...\n");
for(i=0; i<n; i++) {
numnew=newnumRight(n, num);
num=numnew;
printf("NEWNUM = %d\n", numnew);
}
printf("\n循环左移...\n");
for(i=0; i<n; i++) {
numnew=newnumLeft(n, num);
num=numnew;
printf("NEWNUM = %d\n", numnew);
}
return 0;
}
int count(int num) {
int n=0;
if(num>=0 && num<=9) {
n=1;
} else {
do {
num/=10;
n++;
} while(num>=1);
}
return n;
}
int newnumRight(int n, int num) {
int i;
char *cnum;
char *newcnum;
cnum = malloc((n+1)*sizeof(char));
if(cnum == NULL) {
printf("first malloc error... again!\n");
exit(0);
}
*(cnum+n)='\0';
newcnum = malloc((n+1)*sizeof(char));
if(newcnum == NULL) {
printf("second malloc error... again!\n");
exit(0);
}
*(newcnum+n)='\0';
itoa(num,cnum,10);
i=--n;
for(n=0; n<i; n++) {
*(newcnum+n) = *(cnum+n+1);
}
*(newcnum+i)=*cnum;
num=atoi(newcnum);
free(cnum);
free(newcnum);
return num;
}
int newnumLeft(int n, int num) {
int i;
char *cnum;
char *newcnum;
cnum = malloc((n+1)*sizeof(char));
if(cnum == NULL) {
printf("first malloc error... again!\n");
exit(0);
}
*(cnum+n)='\0';
newcnum = malloc((n+1)*sizeof(char));
if(newcnum == NULL) {
printf("second malloc error... again!\n");
exit(0);
}
*(newcnum+n)='\0';
itoa(num,cnum,10);
i=--n;
for(; n>0; n--) {
*(newcnum+n) = *(cnum+n-1);
}
*newcnum=*(cnum+i);
num=atoi(newcnum);
free(cnum);
free(newcnum);
return num;
}
