1.任意位超长数据加法运算
分析:超长数据,没有数据类型与其对应,无法通过scanf进行输入,只能存储于数组中。定义char型数组,输入后在转换为十进制数。
下列算法思想(右对齐):
12345+123456:
5 4 3 2 1
+ 6 5 4 3 2 1
—————————
1 0 8 5 3 1
结果为 135801.
代码为:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 30
void shift(int a[], int n);
void main()
{
int x[N] = {0} , y[N] = {0}, z[N+1] = {0}, i, carry = 0, flag;
i = N -1 ;
while( i>= 0 && isdigit( *(x+i)=getchar() ) )
*(x+i--) -= '0';
if(i>=0)
shift(x,i);
i = N-1;
while( i>=0 && isdigit( *(y+i) = getchar() ) )
*(y+i--) -= '0';
if ( i>=0 )
shift(y,i);
for (i=0; i<N; i++){
*(z+i) = *(x+i) + *(y+i) + carry;
carry = ( *(z+i) - *(z+i)%10 ) / 10;
*(z+i)%=10;
*(z+i)+='0';
}
*( z+N )=carry + '0';
flag=0;
for (i=N; i>=0; i--)
{
if ( flag==0 && *(z+i)!='0') flag = 1;
if (flag == 1 ) putchar(*(z+i) );
}
puts("\n");
}
void shift(int a[], int n)
{
int k, len, sft;
len = N-1-n;
sft = 1+n;
for (k=0; k<len; k++)
*(a+k) = *(a+k+sft);
for (k=len;k<N;k++)
*(a+k)=0;
}
2.字符串排序。
要求:
1,字母不区分大小写,按先后顺序打印。
2,非字母原位打印
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define N 500
void main()
{
char s[N], *p = s;
int i, j, len;
gets(p);
len = strlen(p) ;
for(i=0,j=0;i<26;i++) // 排序
{
p = s;
while ( *p && j < len )
{
if( isalpha(s[j])!=0 && tolower(*p) == 'a'+i ) //字母位,排序。
{
putchar( *p );
j++;
}
else if ( !isalpha(s[j]) ) <span style="font-family: Arial, Helvetica, sans-serif;">//非字母位,原位打印</span>
{
putchar( s[j] );
j++;
}
p++;
}
}
}
3.单个字符串第一次出现则打印。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 128
void main()
{
int num[N]={0};
char s[N] = {""};
char c;
char *p = s;
int i = 0;
int j = 0;
int len ;
int flag = 0;
gets(p);
len = strlen (p);
for(i=0; i<len; i++)
{
c = *(p+i);
j = 0;
while( *p )
{
if (c == *p++)
j++;
}
if (j == 1)
{
putchar(c);
flag = 1;
break;
}
p = s;
}
if (!flag)
{
putchar('.');
}
}
4.输入一个整数,反序输出其字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 128
void reverse(char *p);
void main()
{
long a;
char s[N], *p = s;
scanf("%ld", &a);
p = ltoa(a, p, 10);
reverse(p);
puts(p);
}
void reverse(char *p)
{
int i,j,len;
char tmp;
len = strlen(p);
for(i=0,j=len-1;i<j;i++,j--)
{
tmp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = tmp;
}
}
5.最小公倍数
#include <stdio.h>
int divisor(int m, int n);
void main()
{
int multi;
int m, n;
scanf("%d%d", &m, &n);
multi = m*n;
printf("%d", multi/divisor(m, n));
}
int divisor(int m, int n)
{
int tmp;
if(m<n)
{
tmp = m;
m = n;
n = tmp;
}
tmp = m%n;
if (tmp==0)
return n;
else
return divisor(n, tmp);
}
5. 详细描述:
将输入的两个字符串合并。
对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。
这里的下标意思是字符在字符串中的位置。
对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,
则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符。
如字符为‘4’,为0100b,则翻转后为0010b,也就是2。转换后的字符为‘2’;
如字符为‘7’,为0111b,则翻转后为1110b,也就是e。转换后的字符为大写‘E’。
举例:输入str1为"dec",str2为"fab",合并为“decfab”,
分别对“dca”和“efb”进行排序,排序后为“abcedf”,转换后为“5D37BF”
样例输入:
dec fab
样例输出:
5D37BF
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define N 1000
#define M 500
void strsort(char *p);
unsigned char num(unsigned char dat);
void main()
{
char ss[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char s1[N]={""};
char s2[M]={""};
char *p1 = s1;
char *p2 = s2;
scanf("%s",s1);
scanf("%s",s2);
strcat(s1, s2);
strsort(s1);
strsort(s1+1);
while( *p1)
{
if (isdigit(*p1) )
{
*p1 = *p1 - '0';
*p1 = num(*p1);
*p1 = ss[*p1];
}
else if( isalpha(*p1) && toupper(*p1) <= 'F' && toupper(*p1) >= 'A' )
{
*p1 = toupper(*p1) - 'A'+10;
*p1 = num(*p1);
*p1 = ss[*p1];
}
p1++;
}
puts(s1);
}
void strsort(char *p)
{
char tmp;
int i = 0, j = 0;
int len;
len = strlen(p) - 1;
for (i=0;i <= len;i+=2)
{
for (j=i+2 ;j <= len; j+=2)
{
if ( *(p+j) < *(p+i) )
{
tmp = *(p+j);
*(p+j) = *(p+i);
*(p+i) = tmp;
}
}
}
}
unsigned char num(unsigned char dat)
{
unsigned char val = dat;
val = ((dat & 0x01) << 3) | ((dat & 0x02) << 1) | ((dat & 0x04) >> 1) | ((dat & 0x08) >> 3) ;
return val;
}
6.链表倒数第k个节点
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
void main()
{
int i=0,n;
int k;
Node *p, *q, *head;
scanf("%d",&n);
p = (Node *)malloc(sizeof(Node));
if(!p) return;
head = p;
scanf("%d", &p->data);
p->next = NULL;
while(++i != n)
{
q = (Node *)malloc(sizeof(Node));
if (!q) return;
scanf("%d",&q->data);
p->next = q;
p = p->next;
}
p->next = NULL;
scanf("%d",&k);
if (k>=n || k<0)
return ;
p = head;
q = head;
i = 0;
while(i++ != k+1)
{
q = q->next;
i;
}
while(q)
{
p = p->next;
q = q->next;
}
printf("%d", p->data);
}