基础练习 十六进制转八进制

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

本来打算先将十六进制转换成十进制数,再由十进制数转换成八进制,试了多次发现行不通(数字太大超过 unsigned long long范围),十六进制转换成十进制数,再由十进制数转换成八进制代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
int main()
{
	int n,i,num,j;
	int temp,a[100];
	int count=1,num1=0;
	char str1[100000];
	unsigned long long sum=0;
	
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		sum=0,count=1,num1=0;
		scanf("\n");
		strcpy(str1," ");
		gets(str1);
		temp=strlen(str1);
		for(j=0;j<=strlen(str1);j++)
		{
				
			if(str1[j]>='A'&&str1[j]<='F')
			{
				str1[j]=str1[j]-'A'+10;
			}
			else if(str1[j]>='0'&&str1[j]<='9')
			{
				str1[j]=str1[j]-'0';
			}
			sum+=str1[j]*pow(16,temp-1);
			temp=temp-1;
		}
		j=0;
		while(sum)
		{
			a[j]=sum%8;
			sum=sum/8;
			j++;
		}
		for(j=j-1;j>=0;j--)
		{
			printf("%d",a[j]);
		}
	}
	return 0;	
} 

十六进制转换成二进制数,再由二进制数转换成八进制代码如下:

 

1007 素数对猜想

1007 素数对猜想 (20 分)

让我们定义dn为:dn=pn+1pn,其中pi是第i个素数。显然有d1=1,且对于n>1dn是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<105),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4
#include<stdio.h>
#include<math.h>
int fac(int n)//判断是否为素数
{
	int i;
	
	if(n==1)
		return 0;
	if(n==2)
		return 1;
	if(n%2==0)
		return 0;
	for(i=2;i<=sqrt(n)+1;i++)
	{
		if(n%i==0)
		return 0;
	} 
	return 1;
}
int main()
{
	int n,i;
	int num=0;
	
	scanf("%d",&n);
	for(i=3;i<=n;i++)
		if(fac(i))
			if(fac(i+2)&&i+2<=n)
				num++;
	printf("%d",num);
}

 

结构指针

结构指针的概念

结构指针就是指向结构变量的指针

例:

struct student s1={10,"wang",8,7,9},*p;

p=&s1;

第一条语句定义了struct student 类型的变量s1并初始化,另外还定义了一个结构指针变量

第二条语句使结构指针指向结构变量s1,结构指针的值实际上是结构变量的首地址

用*p访问结构成员
(*p).num=10;

(*p)的括号是不可少的,因为成员运算符“.”的优先级高于“*”的优先级。

用指向运算符->访问指针指向的结构成员
p->num=10;

在使用结构指针访问结构成员时,通常使用指向运算符->

结构指针作为函数参数

int score (struct student *p,int n,int num,int course,int score);

其调用语句

pos=score(students,n,num,course,score);

对应的实参是结构数组名students

PAT (Basic Level) Practice (中文)1003 我要通过!

1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

  1. 字符串中必须仅有 PAT这三种字符,不可以包含其它字符;
  2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
  3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 abc 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为 PAT 写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO
#include<stdio.h>
#include<string.h>
int main()
{
	int n,i;
	char s1[100];
	int count=0,j=0,k=0,num1,num2,num3,num;
	int a[20]={0}; 
	
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		count=0;num1=0;num2=0;num3=0;num=0; 
		scanf("%s",&s1); 
		for(j=0;j<=strlen(s1);j++)
		{
			if(s1[j]=='A'||s1[j]=='P'||s1[j]=='T')
			{
				count++;	
			}
		}
		for(j=0;j<=strlen(s1);j++)
		{
			if(s1[j]=='A')
			{
				num++;	
			}
		}
		j=0;
		while(s1[j++]!='P')
		{
			num1++;	
		}
		while(s1[j++]!='T')
		{
			num2++;
		}
		num3=strlen(s1)-num1-num2-2;
		if(count==strlen(s1)&&count>=3)
		{
			if(num3==num1*num2)
				a[k++]=1;
			else if(s1[0]=='P'&&s1[strlen(s1)-1]=='T'&&num==count-2)
				a[k++]=1;
			else
				a[k++]=0;
		}
		else
			a[k++]=0;
	}
	for(i=0;i<k;i++)
	{
		if(a[i]==1)
		printf("YES\n");
		else
		printf("NO\n");	
	}
}

个人认为这道题最难的就是对题目的理解,以下是我个人对于题目的分析:

如果 aPbTc 正确,则 aPbATca 正确

如果PAT(a=NULL,b=A,c=NULL)正确,则PAAT,PAAAT,PAAAAT等都正确。

如果APATA(a=A,b=A,c=A)正确,则APAATAA,APAAATAAA,APAAAATAAAA等都正确。

如果PATA(a=NULL,b=A,c=A)正确,则PAATA,PAAATA,PAAAATA等都正确。//这种情况不可能发生,因为“任意形如 xPATx 的字符串都可以获得’答案正确‘”。

如果APAT(a=A,b=A,c=NULL)正确,则APAATA,APAAATAA,APAAAATAAA等都是正确的。//这种情况不可能发生,因为”任意形如 xPATx 的字符串都可以获得’答案正确’

指针,数组和地址间的关系

联系:数组名本身是一个地址即指针值

区别:指针是以地址为值的变量,而数组名的值的值是一个特殊的固定地址,可以把它看作是指针常量。

例1

int a[40],*p;

系统分别把编号为3000,3004,3008等的内存字节作为数组元素a[0],a[1],a[2]等的地址(假设int型变量的长度是4个字节)。其中内存位置3000是数组a的基地址,也是a[0]的地址。

例2

假设a[0]的地址为3000,int类型变量的长度为4字节。

p=a;
p=&a[0];

它们都把3000这个地址赋给了指针p。

p=a+1;
p=&a[1];

它们都把3004这个地址赋给了指针p。

例3

设已对a的数组元素进行了赋值

数组求和法一
sum=0;
for(p=a;p<=&a[99];p++)
    num+=*p;

在循环中,指针变量p的初值是数组a的基地址,p连续取值&a[0],&a[1],&a[2]等。

数组求和法二
sum=0;
for(i-0;i<100;i++)
     sum+=*(a+1);

*[a+i]与a[i]等价,*[p+i]与p[i]等价。

数组求和法三
p=a;
sum=0;
for(i=0;i<100;++i) 
   sum+=p[i];

数组名可以使用指针形式,而指针变量也可以使用转换为数组形式。