1.打印日期
给出年分m和一年中的第n天,算出第n天是几月几号。
输入描述:
输入包括两个整数y(1<=y<=3000),n(1<=n<=366)。
输出描述:
可能有多组测试数据,对于每组数据, 按 yyyy-mm-dd的格式将输入中对应的日期打印出来。
#include <stdio.h>
#include <stdbool.h>
bool isrun(int y){ //判断是否是闰年
if(y%400==0||(y%4==0&&y%100!=0)){
return true;
}
return false;
}
int main() {
int y,d;
scanf("%d %d",&y,&d);
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isrun(y)){
arr[2]=29;
}
int i = 1;
while(d>arr[i]){
d = d-arr[i];
i++;
}
printf("%04d-%02d-%02d",y,i,d);
return 0;
}
%d左对齐,输出变量的所有数字;%4d右对齐,宽度为4,左边填充空格,当变量的实际宽度大于4时,输出变量的所有数字;%04d与%4d的唯一区别就是左边填充0。
以%d,%4d,%04d,输出12时,结果是:
12
两个空格12
0012
2.日期累加
设计一个程序能计算一个日期加上若干天后是什么日期。
输入描述:
输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。
输出描述:
输出m行,每行按yyyy-mm-dd的个数输出。
#include <stdio.h>
#include <stdbool.h>
bool isrun(int y){
if(y%400==0||(y%4==0&&y%100!=0)) return true;
return false;
}
int main() {
int n,y,m,d,num;
int f=365; // 一年天数
scanf("%d",&n);
while(n--){
scanf("%d %d %d %d",&y,&m,&d,&num);
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(isrun(y)){
arr[2]=29;
f=366;
}
// 判断原始日期为哪一天
int old_day=0;
for(int j=1;j<m;j++){
old_day+=arr[j];
}
old_day+=d;
int new_day=0;
new_day = old_day + num;
int i=1;
if(new_day<=f){ // 没超过一年
while(new_day>arr[i]){
new_day-=arr[i];
i++;
}
}else{
y++; //新的一年
new_day-=f; // 减去去年的天数
if(isrun(y)){
arr[2]=29;
f=366;
} else{
arr[2]=28;
f=365;
}
while(new_day>arr[i]){
new_day-=arr[i];
i++;
}
}
printf("%04d-%02d-%02d\n",y,i,new_day);
}
return 0;
}
基本思路
原来日期是一年中的具体天数,再加上天数等于新的具体天数,在此过程中要注意判断闰年,以及跨年考虑新的一年是否是闰年
3.剩下的树
有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入描述:
两个整数L(1<=L<=10000)和M(1<=M<=100)。 接下来有M组整数,每组有一对数字。
输出描述:
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
#include <stdio.h>
int main() {
int L,M;
scanf("%d %d",&L,&M);
// 种树
int tree[10001];
for(int i=0;i<=L;i++){
tree[i]=1;
}
// 挖树
for(int j=0;j<M;j++){
// 左右区间
int l,r;
scanf("%d %d",&l,&r);
for(int k=l;k<=r;k++){
tree[k]=0;
}
}
// 数树
int num=0;
for(int i=0;i<=L;i++){
if(tree[i]==1) num++;
}
printf("%d",num);
return 0;
}
5.排序(这里采用快排)
描述
对输入的n个数进行排序并输出。
输入描述:
输入的第一行包括一个整数n(1<=n<=100)。 接下来的一行包括n个整数。
输出描述:
可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格。 每组测试数据的结果占一行。
#include <stdio.h>
void quick_sort(int num[], int low, int high )
{
int i,j,temp;
int tmp;
i = low;
j = high;
tmp = num[low]; //任命为中间分界线,左边比他小,右边比他大,通常第一个元素是基准数
if(i > j) //如果下标i大于下标j,函数结束运行
{
return;
}
while(i != j)
{
while(num[j] >= tmp && j > i)
{
j--;
}
while(num[i] <= tmp && j > i)
{
i++;
}
if(j > i)
{
temp = num[j];
num[j] = num[i];
num[i] = temp;
}
}
num[low] = num[i];
num[i] = tmp;
quick_sort(num,low,i-1);
quick_sort(num,i+1,high);
}
int main() {
int n;
int arr[101];
while (scanf("%d",&n)!=EOF) {
for(int i=0;i<n;i++){
scanf("%d ",&arr[i]);
}
quick_sort(arr,0,n-1);
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
return 0;
}
6.比较两个字符串长度(不使用库)
返回较长字符串,若相同,返回第一个
#include<stdio.h>
char *fun(char *s,char *t)
{
char *p=s,*q=t;
while(*p||*q)
{
if(*p==NULL&&*q!=NULL)
return t;
if(*p==NULL&&*q==NULL)
return s;
if(*p!=NULL&&*q==NULL)
return s;
p++;
q++;
}
}
int main()
{
char a[20],b[20];
printf("Input 1th String:");
gets(a);
printf("Input 2th String:");
gets(b);
printf("%s\n",fun(a,b));
}
用指针
7.回文串
#include<stdio.h>
#include<string.h>
bool fun(char *a){
char *s;
s=a;
int n=0;
for(;*s!='\0';s++) n++;
s--; // 指向最后一个元素
int i;
for(i=0;i<n/2;i++){
if(*a!=*s) return false;
a++;
s--;
}
return true;
}
int main(){
char a[20];
gets(a);
if(fun(a)) printf("yes");
else printf("no");
return 0;
}
8.字符串逆置
#include<stdio.h>
#include<string.h>
void fun(char *a){
char *s;
s=a;
char t;
for(;*s!='\0';s++);
s--; // 指向最后一个元素
for(;s-a>=1;a++,s--){
t=*a;
*a=*s;
*s=t;
}
}
int main(){
char a[20];
gets(a);
fun(a);
puts(a);
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
char a[20];
int i=0;
while((a[i]=getchar())!='\n') i++;
while(i>=0){
printf("%c",a[i]);
i--;
}
return 0;
}
9.删除字符串的数字字符,以#作为结束标志
#include<stdio.h>
#include<string.h>
void fun(char *p){
char a[20];
int i=0,j=0,k;
for(;*(p+i)!='#';i++){
if(*(p+i)<'0'||*(p+i)>'9'){
a[j++]=*(p+i);
k=j;
}
}
a[k]='\0';
strcpy(p,a); //复制
}
int main(){
char p[20];
gets(p);
fun(p);
puts(p);
return 0;
}