PETER 吸烟!(吸烟有害健康请尽早戒烟)
1.
Peter 有n根烟,他每吸完一根烟就把烟蒂保存起来,k(k>1)个烟蒂可以换一个新的烟,那么 Peter 最终能吸到多少根烟呢?
输入格式
每组测试数据一行包括两个整数n,k(1<n,k≤108)。
输出格式
对于每组测试数据,输出一行包括一个整数表示最终烟的根数。
输入输出样例
输入 #1
4 3
输出 #1
5
输入 #2
10 3
输出 #2
14
!一开始觉得这道题很简单没想到在测试时候有一个没有过,然后陷入沉思。
源代码 没用循环有问题!
修改后的代码如下
#include<stdio.h>
main()
{
int n,d,k,x,m,z,y;
scanf("%d %d",&n,&k);
m=n/k;
z=m;
while(z>=k)
{
x=z/k;//用烟蒂换的烟//
y=z%k;//剩余烟蒂//
m=m+x;//peter吸的利息烟//
z=x+y;//总烟蒂//
}
printf("%d",m+n);
}
其实就是给几个数然后算出来,再加点自己的理解,然后把它变成代码就可以了,卑微的我只能菜到这个地步了.
链表的建立和输出
插法比较熟,菜鸡我对头插不太熟悉,这周真正努力学. 加油!!! 奥利给!
2.
#include<stdio.h>
struct f
{
int data;
char name[11];
struct f *next;
}; //定义一个结构体//
struct f *creat(void) //链表的创建函数//
{
struct f *head,*p,*end;
head=end=(struct f*)malloc(sizeof(struct f));
printf("请输入学号以及你的姓名!");
p=(struct f*)malloc(sizeof(struct f));
scanf("%d %s",&p->data,p->name);
while(p->data!=0)
{
end->next=p;
end=p;
printf("请输入学号以及你的姓名!");
p=(struct f*)malloc(sizeof(struct f));
scanf("%d %s",&p->data,p->name);
}
end->next=NULL;
free(p);
return head;
}
void print(struct f*head) //链表的输出函数//
{
head=head->next;
while(head!=NULL)
{
printf("%d %s\n",head->data,head->name);
head=head->next;
}
}
main() //卑微主函数//
{
struct f *head;
head=creat();
print(head);
}
头插法下周写,自己太菜,理解理解!
链表的增删改查
3.
一…链表的插入
多的不说了直接代码!!!
int insert(struct f *head)
{
struct f *p;
p=(struct f *)malloc(sizeof(struct f));
printf("请输入要加入的学生的学号和姓名\n");
scanf("%d %s",&p->data,p->name);
while(head->next!=NULL&&head->next->data<p->data)
head=head->next;
if(head->next->data==p->data)
{
free(p);
return 0;
}
p->next=head->next;
head->next=p;
return 1;
}
二.查找链表
struct f *find(struct f *head)
{
printf("请输入要查找的学生的学号!");
int num;
scanf("%d",&num);
head=head->next;
while(head!=NULL)
{
if(head->data==num)
return head;
}
return NULL;
}
三.删除链表
int delete(struct f*head)
{
int num;
struct f *p;
p=head->next;
if(p==NULL)
return 0;
printf("请输入要删除的学生学号");
scanf("%d",&num);
head=head->next;
while(p!=NULL)
{
if(p->data==num)
{
head->next=p->next;
free(p);
return 1;
}
head=p;
p=p->next;
}
return 0;
}
之后出现这这个!!
问题 :if()限制条件 忘记判断是否指空
顺序链表未完成
#include<stdio.h>
struct f
{
int data;
char name[11];
struct f *next;
};
int insert(struct f *head)
{
struct f *p;
p=(struct f *)malloc(sizeof(struct f));
printf("请输入要加入的学生的学号和姓名\n");
scanf("%d %s",&p->data,p->name);
while(head->next!=NULL&&head->next->data<p->data)
head=head->next;
if(head->next!=NULL&&head->next->data==p->data)
{
free(p);
return 0;
}
p->next=head->next;
head->next=p;
return 1;
}
int delete(struct f*head)
{
int num;
struct f *p;
p=head->next;
if(p==NULL)
return 0;
printf("请输入要删除的学生学号\n");
scanf("%d",&num);
while(p!=NULL)
{
if(p->data==num)
{
head->next=p->next;
free(p);
return 1;
}
head=p;
p=p->next;
}
return 0;
}
struct f *find(struct f *head)
{
printf("请输入要查找的学生的学号!\n");
int num;
scanf("%d",&num);
struct f *p;
p=head->next;
while(p!=NULL)
{
if(p->data==num)
return p;
else
p=p->next;
}
return NULL;
} //定义一个结构体//
struct f *creat(void) //链表的创建函数//
{
struct f *p,*q,*head,*pre=NULL;
head=(struct f*)malloc(sizeof(struct f));
if(head==NULL)
{
return 0;
}
p=head->next;
while(1)
{
q=(struct f*)malloc(sizeof(struct f));
if(q==NULL)
return 0;
printf("请输入学号和姓名");
scanf("%d %s",&q->data,q->name);
if(q->data==0)
break;
while(p!=NULL&&p->data<q->data)
{
pre=p;
p=p->next;
}
if(pre == NULL)
{
head->next=q;
q->next=p;
}
if(p->data==q->data)
{
free(q);
return 0;
}
else
{
pre->next=q;
q->next=p;
}
}
free(q);
return head;
}
void print(struct f*head) //链表的输出函数//
{
head=head->next;
while(head!=NULL)
{
printf("%d %s\n",head->data,head->name);
head=head->next;
}
}
main() //卑微主函数//
{
struct f *head,*p;
head=creat();
print(head);
if(insert(head))
printf("插入成功!\n");
else
printf("插入失败!(有重名!!)\n");
print(head);
p=find(head);
if(p)
printf("找到学生 该生的信息是\n%d %s\n",p->data,p->name);
else
printf("没找到!\n");
print(head);
if(delete(head))
printf("已删除\n");
else
printf("删除失败\n");
print(head);
}
输入时陷入死循环!
4.请统计某个给定范围[L, R][L,R]的所有整数中,数字 22 出现的次数。
比如给定范围[2, 22][2,22],数字 22 在数 2 2中出现了 11 次,在数 1212 中出现 11 次,在数 2020 中出现 1 1次,在数 21 中出现 11 次,在数 2222 中出现 2 2次,所以数字 22 在该范围内一共出现了 66次。
输入格式
22个正整数 LL 和 RR,之间用一个空格隔开。
输出格式
数字 2 2出现的次数。
输入输出样例
输入 #1 复制
2 22
输出 #1 复制
6
输入 #2 复制
2 100
输出 #2 复制
20
#include<stdio.h>
int f(int n) //建立一个对一个数字判断2的个数的函数//
{
int x,y=0;
while(n!=0)
{
x=n%10;
if(x==2)
y++;
n=n/10;
}
return y;
}
int main()
{
int n,m,i,t=0;
scanf("%d %d",&n,&m);
for(i=n;i<=m;i++)
{
t=t+f(i);
}
printf("%d",t);
return 0;
}
5. 选数 递归
已知 n 个整数 x1,x2,…,xn,以及1个整数k(k<n)。从n个整数中任选k个整数相加,可分别得到一系列的和。例如当n=4,k=3,4个整数分别为3,7,12,19时,可得全部的组合与它们的和为:
3+7+12=22
3+7+19=29
7+12+19=38
3+12+19=34。
现在,要求你计算出和为素数共有多少种。
例如上例,只有一种的和为素数:3+7+19=29。
输入格式
键盘输入,格式为:
n,k(1≤n≤20,k<n)
x1,x2,…,xn(1≤xi≤5000000)
输出格式
屏幕输出,格式为: 1个整数(满足条件的种数)。
输入输出样例
输入 #1
4 3
3 7 12 19
这个是源代码
#include<stdio.h>
int f(int a)
{ int i;
for(i=2;i<a;i++)
{
if(a%i==0)
break;
}
if(a==i)
return 1;
else
return 0;
}
int n,k;
int a[25];
int b[25];
long long ans=0;
void dfs(int m,int sum,int p)
{
int i;
if(m==k)
{
if(f(sum))
ans++;
return ;
}
for(i=p;i<n;i++)
{
if(b[i])
continue;
b[i]=1;
dfs(m+1,sum+a[i],i+1);
b[i]=0;
}
return ;
}
int main()
{ int i;
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
dfs(0,0,0);
printf("%d",ans);
}
我手跑了一遍之后发现 b[i]数组似乎和这道题没关系于是删除了它!
#include<stdio.h>
int f(int a) //该函数是素数判断函数//
{ int i;
for(i=2;i<a;i++)
{
if(a%i==0)
break;
}
if(a==i)
return 1;
else
return 0;
}
int n,k;
int a[25];
long long ans=0;
void dfs(int m,int sum,int p) //m代表选了几个数,sum是选的这几个数的和,p代表啊a[i]数组中的数
{
int i;
if(m==k) //如果选的数是3个的话,判断这3个数的和是否是为素数//
{
if(f(sum))
ans++;
return ;
}
for(i=p;i<n;i++) // 选3个数的和//
{
dfs(m+1,sum+a[i],i+1); //递归//
}
return ;
}
int main()
{ int i;
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
dfs(0,0,0);
printf("%d",ans);
}
这个是修改之后的代码 修改后依然可以全部通过! 但是修改后 如若题目改成不能出现相同数字,就不行,如果题目改成不能出现相同数字的话,先可以用一个函数 删除掉里面重复的数,然后再调用dfs函数,这道题主要考察递归,对递归的理解存在一定问题!!希望加强!
6
浮点数和整形相比较的时候 整形会上升为double 会不准确!
eg:
#include<stdio.h>
int main()
{
int i=1;
double t=1.0;
if(i>1.0)
printf(" 123");
else
printf(" 1");
}
他会输出这个东西
这个是顺序输出的链表
#include<stdio.h>
struct f
{
int data;
char name[11];
struct f *next;
};
int insert(struct f *head)
{
struct f *p;
p=(struct f *)malloc(sizeof(struct f));
printf("请输入要加入的学生的学号和姓名\n");
scanf("%d %s",&p->data,p->name);
while(head->next!=NULL&&head->next->data<p->data)
head=head->next;
if(head->next!=NULL&&head->next->data==p->data)
{
free(p);
return 0;
}
p->next=head->next;
head->next=p;
return 1;
}
int delete(struct f*head)
{
int num;
struct f *p;
p=head->next;
if(p==NULL)
return 0;
printf("请输入要删除的学生学号\n");
scanf("%d",&num);
while(p!=NULL)
{
if(p->data==num)
{
head->next=p->next;
free(p);
return 1;
}
head=p;
p=p->next;
}
return 0;
}
struct f *find(struct f *head)
{
printf("请输入要查找的学生的学号!\n");
int num;
scanf("%d",&num);
struct f *p;
p=head->next;
while(p!=NULL)
{
if(p->data==num)
return p;
else
p=p->next;
}
return NULL;
} //定义一个结构体//
struct f *creat(void) //链表的创建函数//
{
struct f *head,*p,*end;
int x;
head=end=(struct f*)malloc(sizeof(struct f));
printf("请输入学号以及你的姓名!\n");
p=(struct f*)malloc(sizeof(struct f));
scanf("%d %s",&p->data,p->name);
end->next=p;
end=p;
end->next=NULL;
printf("请选择继续输入和退出,继续输出请输入1,退出输入0\n");
while(scanf("%d",&x),x!=0)
{
insert(head);
printf("请选择继续输入和退出,继续输出请输入1,退出输入0\n");
}
return head;
}
void print(struct f*head) //链表的输出函数//
{
head=head->next;
while(head!=NULL)
{
printf("%d %s\n",head->data,head->name);
head=head->next;
}
}
main() //卑微主函数//
{
struct f *head,*p;
head=creat();
print(head);
if(insert(head))
printf("插入成功!\n");
else
printf("插入失败!(有重名!!)\n");
print(head);
p=find(head);
if(p)
printf("找到学生 该生的信息是\n%d %s\n",p->data,p->name);
else
printf("没找到!\n");
print(head);
if(delete(head))
printf("已删除\n");
else
printf("删除失败\n");
print(head);
}
在原来无序链表的基础上,经过学长的悉心指导,无知的我终于懂了,他就是在创建函数中调用插入函数,唯一和原来无序链表不一样的是 先创立了一个节点然后就通过插入函数进行链表的创建。。。。本人拙见,不喜勿喷!
6.找数字(暴力法高等的暂时不太会)
请统计某个给定范围[L, R][L,R]的所有整数中,数字 22 出现的次数。
比如给定范围[2, 22][2,22],数字 22 在数 2 2中出现了 11 次,在数 1212 中出现 11 次,在数 2020 中出现 1 1次,在数 21 中出现 11 次,在数 2222 中出现 2 2次,所以数字 22 在该范围内一共出现了 66次。
输入格式
22个正整数 LL 和 RR,之间用一个空格隔开。
输出格式
数字 2 2出现的次数。
输入输出样例
输入 #1 复制
2 22
输出 #1 复制
6
输入 #2 复制
2 100
输出 #2 复制
20
说明/提示
1 ≤ L ≤R≤ 1000001≤L≤R≤100000。
#include<stdio.h>
int f(int n)
{
int x,y=0;
while(n!=0)
{
x=n%10;
if(x==2)
y++;
n=n/10;
}
return y;
}
int main()
{
int n,m,i,t=0;
scanf("%d %d",&n,&m);
for(i=n;i<=m;i++)
{
t=t+f(i);
}
printf("%d",t);
}
就是在做每个数字的时候把每个数字的每一位都取出来然后看是否是一是一的话加一不是一的话就不加一,这是很暴力的作法,但小弟就菜的如此了!
本周总结
{
1.算法题刷的很少。
2.学习了链表的增删改查。
3.算法题做的很少。
}
下周任务
{
1.努力刷算法题,不负祖国厚望!
2.找时间学习文件;
3.努力刷算法题,不负学长厚望!
};
return 0;
}