C语言Day14(c程序设计小红书+pta)
目录
(一)求总天数pta
题目说明:
代码实现:
程序分析:
(二)十进制整数转换成R进制数pta
题目说明:
代码实现:
程序分析:
(三)删除字符串中数字字符
(四)字符串拷贝-strNcpy
(五)无符号整数的内部结构
(六)统计对称素数
(七)输入单词并排序输出
(八)长整数转化成16进制字符串
(一)求总天数pta
题目说明:
代码实现:
int leapyear(int y)
{
return ((y%4==0&&y%100!=0)||(y%400==0));
}
int TotalDay(int year, int month, int day)
{
int monday[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(year<1||month<1||month>12||day<1)
return 0;
if(month==2&&day>29)
return 0;
if(month!=2&&day>monday[month-1])
return 0;
int d;
d=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400;
if(leapyear(year))
monday[1]=29;
else
monday[1]=28;
for(int i=1;i<month;i++)
{
d+=monday[i-1];
}
d+=day;
return d;
}
程序分析:
1.在 C 语言中,对于条件表达式和逻辑表达式,如果结果为 “真”,通常返回值是 1;如果结果为 “假”,则返回值是 0。所以先定义了一个判断闰年的int型函数,如果是闰年会返回1,如果不是闰年会返回0.
2.接下来在int TotalDay(int year, int month, int day)函数中先定义了几个结果为零的情况。包括year < 1 || month < 1 || month > 12 ,month == 2 && day > 28,day > monthday[month - 1](尤其注意这一条,因为数组是从0开始的,所以month要-1)。
3.然后计算按年份来的总天数,先假设每年都是365天,再另算闰年的情况。
4.再计算按月份的总天数。注意二月份的特殊情况。
5.再加上日期中哪一天的天数。
(二)十进制整数转换成R进制数pta
题目说明:
代码实现:
#include<stdio.h>
void zhuanhuan(int n,int r)
{
if(n==0)
{
printf("0");
return;
}
char a[]="0123456789ABCDEF";
char s[100];
int i=0;
while(n>0)
{
s[i++]=a[n%r];
n=n/r;
}
for(int j=i-1;j>=0;j--)
{
printf("%c",s[j]);
}
}
int main()
{
int n,r;
scanf("%d %d",&n,&r);
zhuanhuan(n,r);
return 0;
}
程序分析:
定义一个字符数组 a,存储了用于表示不同进制的字符,包括数字 0-9 和字母 A-F,可用于表示十六进制以下的各种进制。
(三)删除字符串中数字字符
void delnum(char *s)
{
char*p=s;
for(int i=0;s[i]!='\0';i++)
if((s[i]<'0')||(s[i]>'9'))
{
*p++=s[i];
}
*p='\0';
}
(四)字符串拷贝-strNcpy
int strNcpy(char* dest, const char* src, int n)
{
int i = 0;
while (src[i] != '\0')
i++;
int j;
for (j = 0; j < n && src[j] != '\0'; j++)
{
dest[j] = src[j];
}
if (i <n)
{
dest[j] = '\0';
return 1;
}
else
{
dest[n-1] = '\0';
return 0;
}
}
(五)无符号整数的内部结构
#include<stdio.h>
int main() {
unsigned int v;
scanf("%u", &v);
printf("%x\n", v);
unsigned char *s = (unsigned char *)&v;
printf("%x %x %x %x", s[0], s[1], s[2], s[3]);
return 0;
}
(六)统计对称素数
#include <stdio.h>
#include <stdbool.h>
// 判断是否为素数
bool isPrime(int num) {
if (num <= 1) return false;
else if(num <= 3) return true;
else if(num % 2 == 0 || num % 3 == 0) return false;
else
{
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
}
// 判断是否为对称数
bool isPalindrome(int num) {
int reversed = 0, original = num;
while (num != 0) {
reversed = reversed * 10 + num % 10;
num /= 10;
}
return original == reversed;
}
int main() {
int a, b;
scanf("%d %d", &a, &b);
int cnt = 0;
for (int i = a; i <= b; i++)
{
if (isPrime(i) && isPalindrome(i))
cnt++;
}
printf("%d\n", cnt); // 先输出对称素数的个数
if (cnt == 0)
printf("none");
else
{
int j = 0;
for (int i = a; i <= b; i++)
{
if (isPrime(i) && isPalindrome(i) && j==0)
{
printf("%d", i);
j++;
}
else
{
if (isPrime(i) && isPalindrome(i) && j ==1)
printf(" %d", i);
}
}
}
return 0;
}
(七)输入单词并排序输出
int input(char ar2[][21])
{
int count = 0;
char word[21];
while (count < 10)
{
scanf("%20s", word);
if (strcmp(word, "*END*") == 0)
break;
strcpy(ar2[count], word);
count++;
}
return count;
}
void paixu(char ar2[][21], int n)
{
char temp[21];
for (int i = 0; i < n - 1; i++)
{
for (int j = i + 1; j < n; j++)
{
if (strcmp(ar2[i], ar2[j]) > 0)
{
strcpy(temp, ar2[i]);
strcpy(ar2[i], ar2[j]);
strcpy(ar2[j], temp);
}
}
}
}
void printArr(char ar2[][21], int n)
{
if (n == 0)
{
printf("NO WORD\n");
}
else
{
printf("After sorted:\n");
for (int i = 0; i < n; i++)
{
printf("%s", ar2[i]);
if (i < n - 1)
printf(" ");
}
printf("\n");
}
}
(八)长整数转化成16进制字符串
void f( long int x, char *p )
{
if(x==0)
{
*p='0';
}
else if(x<0)
{
x=-x;
*p='-';
p++;
}
long int a=x;int n=0;
while(x!=0)
{
x/=16;
n++;
}
for(int i=0;i<n;i++)
{
int t=a%16;
if(t<10)
{
*(p+n-1-i)=t+'0';
}
else
{
*(p+n-1-i)=t+'A'-10;
}
a/=16;
}
}