C语言指针的作业
指针的作业
- 求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字。
例如:2 + 22 + 222 + 2222 + 22222
/*
求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字。
例如:2 + 22 + 222 + 2222 + 22222
*/
#include <stdio.h>
int main(){
//由a组成前n项之和 - 不考虑溢出
int a = 0;
int n = 0;
scanf("%d %d",&a,&n);
int i = 0;
int sum = 0;
int ret = 0;
for(i = 0;i < n;i++){
ret = ret * 10 + a;
sum = sum + ret;
}
printf("%d\n",sum);
return 0;
}
- 写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整型一维数组。
/*
写一个函数打印arr数组的内容,不使用数组下标,使用指针。
arr是一个整型一维数组。
*/
#include <stdio.h>
int main(){
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int * p = arr;
int sz = sizeof(arr) / sizeof(arr[0]);
int i = 0;
for(i = 0;i < sz;i++){
printf("%d ",*(p+i));
}
return 0;
}
- 求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。
例如:153 = 1^3 + 5^3 + 3^3 ,则153是一个“水仙花数”。
/*
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和正好等于该数本身。
例如:153 = 1^3 + 5^3 + 3^3 ,则153是一个“水仙花数”。
*/
#include <stdio.h>
#include <math.h>
int main(){
int i = 0;
for(i = 0;i <= 100000;i++){
//判断i是否会自幂数
int n = 1;//计算位数
int tmp = i;
while(i / 10){
n++;
tmp = tmp / 10;
}
//计算i的每一位的n次方之和
tmp = i;
int sum = 0;
while(tmp){
//pow是用来求次方的
sum = sum + pow(tmp % 10,n) ;
tmp = tmp / 10;
}
//判断
if(sum == i){
printf("%d ",i);
}
}
return 0;
}
- 写一个函数,逆序字符串内容
/*
写一个函数,逆序字符串内容
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* str){
assert(str);
int len = strlen(str);
char* left = str;
char* right = str + len -1;
while(left < right){
char tmp = *left;
*left = * right;
*right = tmp;
left++;
right--;
}
}
int main(){
char arr[] = "abcdef";
reverse(arr);
printf("%s",arr);
return 0;
}
- 打印杨辉三角
/*
打印杨辉三角
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main(){
int arr[10][10] = {0};
int i = 0;
int j = 0;
for(i = 0;i < 10;i++){
for(j = 0;j < 10;j++){
if(j == 0){
arr[i][j] = 1;
}
if(i == j){
arr[i][j] = 1;
}
if(i >= 2 && j >= 1){
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
}
}
for(i = 0;i < 10;i++){
for(j = 0;j <=i;j++){
printf("%d",arr[i][j]);
}
printf("\n");
}
return 0;
}
- 猜凶手
日本某地发生了一件谋杀案,警察通过排查确定查人凶手为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A:不是我。
B:是C
C:是D
D:C在胡说
已知三个人说了真话,一个人说的是假话。
请根据这些信息,写一个程序来确定到底谁是凶手。
#include <stdio.h>
int main(){
int killer = 0;
for(killer = 'A';killer <= 'D';killer++){
if((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3){
printf("%c\n",killer);
}
}
return 0;
}
- 猜名次
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果:
A:B第二,我第三
B:我第二,E第四
C:我第一,D第二
D:C最后,我第三
E:我第四,A第一
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次。
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int e = 0;
for(a = 1;a <= 5;a++){
for(b = 1;b <= 5;b++){
for(c = 1;c <= 5;c++){
for(d = 1;d <= 5;d++){
for(e = 1;e <= 5;e++){
if(((b == 2) + (a == 3) == 1)
&& ((b == 2) + (e == 4) == 1)
&& ((c == 1) + (d == 2) == 1)
&& ((c == 5) + (d == 3) == 1)
&& ((e == 4) + (a == 1) == 1)
){
if(a*b*c*d*e == 120){
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e);
}
}
}
}
}
}
}
return 0;
}
int a[3][4] = {0};
printf("%d\n",sizeof(a));// 48 = 3*4*sizeof(int)
printf("%d\n",sizeof(a[0][0]));//4 - a[0][0]
printf("%d\n",sizeof(a[0]));//16
printf("%d\n",sizeof(a[0]+1));//4 解释:a[0]作为数组名并没有单独放在sizeof内部,也没有取地址,所以a[0]就是第一行第一个元素的地址。a[0]+1 就是第一行第二个元素的地址
printf("%d\n",sizeof(*(a[0]+1)));//4 *(a[0]+1)是第一行第二个元素
printf("%d\n",sizeof(a+1));
/*
a是二维数组的数组名,并没有取地址,也没有单独存放在sizeof内部,所以a表示二维数组首元素的地址,即:第一行的地址,a+1就是二维数组第二行的地址
*/
printf("%d\n",sizeof(*(a+1)));//16 a+1市第二行的地址,所以解引用后表示第二行的大小就是16
printf("%d\n",sizeof(&a[0]+1));//4 a[0]是第一行的数组名,&a[0]是第一行的地址,&a[0]+1就是第二行的地址
printf("%d\n",sizeof(*(&a[0]+1)));//16 &a[0]+1就是第二行的地址,解引用后就是第二行,所以计算第二行的大小
printf("%d\n",sizeof(*a));//16 第一行的大小 等价a[0]
/*
a作为二维数组的数组名,没有&,没有单独放到sizeof内部,a就是首元素的地址即第一行的地址,所以解引用就是第一行的大小
*/
printf("%d\n",sizeof(a[3]));//16 sizeof内部的表达式不计算 所以判断的是类型 所以其实不存在也能够通过类型计算
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}

int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}

杨氏矩阵:有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找一个数字是否存在。要求:时间复杂度小于O(N)。
#include <stdio.h>
int findNum(int arr[3][3],int* px,int* py,int k ){
int x = 0;
int y = *py-1;
while(x < *px && y >= 0){
if(arr[x][y] < k){
x++;
} else if(arr[x][y] > k){
y--;
}else{
*px = x;
*py = y;
return 1;
}
}
return 0;
}
int main(){
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
int k = 7;
int x = 3;
int y = 3;
int ret = findNum(arr,&x,&y,k);
if(ret == 1){
printf("找到了\n");
printf("坐标为:%d,%d\n",x,y);
}else if(ret != 1){
printf("没找到\n");
}
return 0;
}
字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符可以得到BCDA
ABCD左旋两个字符可以得到CDAB
#include <stdio.h>
#include <string.h>
void LeftMove(char* str,int k){
int i = 0;
int n = strlen(str);
for(i = 0;i < k;i++){
//每次左旋转一个字符
char tmp = *str;
//后面的n-1个字符
int j = 0;
for(j = 0;j < n-1;j++){
*(str + j) = *(str + j +1);
}
//tmp放在最后
*(str + n - 1) = tmp;
}
}
int main(){
char arr[10] = "ABCDEF";
int k = 2;
LeftMove(arr,k);
printf("%s\n",arr);
return 0;
}
另一种方法,三步翻转法
#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char *left,char *right){
assert(left);
assert(right);
while(left < right){
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void LeftMove(char* str,int k){
assert(str);
int n = strlen(str);
//左
reverse(str,str+k-1);
//右
reverse(str+k,str+n-1);
//整体
reverse(str,str+n-1);
}
int main(){
char arr[10] = "ABCDEF";
int k = 2;
LeftMove(arr,k);
printf("%s\n",arr);
return 0;
}
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1=AABCD,s2=BCDAA返回1
给定s1=ABCD,s2=ACBD,返回0
#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
int i = 0;
int n = strlen(str1);
for(i = 0;i < n;i++){
//每次左旋转一个字符
char tmp = *str1;
//后面的n-1个字符
int j = 0;
for(j = 0;j < n-1;j++){
*(str1 + j) = *(str1 + j +1);
}
//tmp放在最后
*(str1 + n - 1) = tmp;
if(strcmp(str1,str2) == 0){
return 1;
}
}
return 0;
}
int main(){
/*
AABCD左旋一个字符:ABCDA
AABCD左旋两个字符:BCDAA
AABCD右旋一个字符:DAABC
*/
char arr1[] = "AABCD";
char arr2[] = "BCDAA";
int ret = IsStringRotate(arr1,arr2);
if(ret == 1){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}
另一种方法:
#include <stdio.h>
#include <string.h>
#include <assert.h>
int IsStringRotate(char *str1,char *str2){
//长度不相等肯定不是旋转得到的
if(strlen(str1) != (strlen(str2))){
return 0;
}
//1.str1字符串后面追加一个str1
//AABCDAABCD
int len = strlen(str1);
strncat(str1,str1,len);
//2.判断str2是否为str1的子串
char *ret = strstr(str1,str2);
if(ret == NULL){
return 0;
}else{
return 1;
}
}
int main(){
/*
AABCD左旋一个字符:ABCDA
AABCD左旋两个字符:BCDAA
AABCD右旋一个字符:DAABC
*/
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret = IsStringRotate(arr1,arr2);
if(ret == 1){
printf("yes\n");
}else{
printf("no\n");
}
return 0;
}
欢迎关注公众号:愚生浅末。
C语言指针的作业的更多相关文章
- C语言博客作业6---结构体&文件
C语言博客作业6---结构体&文件 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容.如下图所示: 1.2.学习体会 描述本周学习感受,也可以在这里提出你不理解地方.对 ...
- C语言博客作业5--指针
C语言博客作业5--指针 1.本章学习总结(2分) 1.1思维导图 请以思维导图总结本周的学习内容,如下图所示: 1.2本章学习体会及代码量学习体会 1.2.1学习体会 描述本周学习感受,也可以在这里 ...
- C语言指针转换为intptr_t类型
1.前言 今天在看代码时,发现将之一个指针赋值给一个intptr_t类型的变量.由于之前没有见过intptr_t这样数据类型,凭感觉认为intptr_t是int类型的指针.感觉很奇怪,为何要将一个指针 ...
- [转]C语言指针学习经验总结浅谈
指针是C语言的难点和重点,但指针也是C语言的灵魂 . 这篇C语言指针学习经验总结主要是我入职以来学习C指针过程中的点滴记录.文档里面就不重复书上说得很清楚的概念性东西,只把一些说得不清楚或理解起来比较 ...
- 不可或缺 Windows Native (7) - C 语言: 指针
[源码下载] 不可或缺 Windows Native (7) - C 语言: 指针 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 指针 示例cPointer.h #i ...
- C语言指针学习
C语言学过好久了,对于其中的指针却没有非常明确的认识,趁着有机会来好好学习一下,总结一下学过的知识,知识来自C语言指针详解一文 一:指针的概念 指针是一个特殊的变量,里面存储的数值是内存里的一个地址. ...
- (转载)c语言指针学习
前言 近期俄罗斯的陨石.四月的血月.五月北京的飞雪以及天朝各种血腥和混乱,给人一种不详的预感.佛祖说的末法时期,五浊恶世 ,十恶之世,人再无心法约束,道德沦丧,和现在正好吻合.尤其是在天朝,空气,水, ...
- 关于C语言指针的问题
在学习关于C语言指针的时候,发现这样一个问题,代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h&g ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- C语言指针和数组知识总结(上)
C语言指针和数组知识总结(上) 一.指针的基础 1.C语言中,变量的值能够通过指针来改变,打印指针的语句符号可以是: %08x 2.指针的本质 指针的本质就是变量,那么既然是变量,那么一定会分配地址 ...
随机推荐
- multipass中docker的使用及固定ip的配置
之前一直用WSL2,但是可能我高估了我笔记本的性能,每次开启后我的win11都闪得厉害. 公司给配发的联想昭阳 前两天实在受不了,把它重装了.才发现之前一直很抵触重装,结果重装完工作几乎没怎么受影响. ...
- 新一代Java高性能构建工具Maven-mvnd【实践可行版】
Maven-mvnd介绍 Maven 的优点是稳定可靠,在绝大多数的项目上工作良好,社区生态很完善,几乎所有的 Java 开发者都在用.Maven 的缺点是,对于大一点的项目来说,构建太慢了.有时候只 ...
- Curve 替换 Ceph 在网易云音乐的实践
Curve 块存储已在生产环境上线使用近三年,经受住了各种异常和极端场景的考验,性能和稳定性均超出核心业务需求预期 网易云音乐背景 网易云音乐是中国领先的在线音乐平台之一,为音乐爱好者提供互动的内容社 ...
- [oeasy]python0043_八进制_oct_octal_october_octave
八进制(oct) 回忆上次内容 什么是 转义? 转义转义 转化含义 \ 是 转义字符 \n.\r是 转义序列 还有什么 转义序列 吗? \a是 响铃 \b 退格键 \t 水平制表符 tab键 \v.\ ...
- SQL分析“聚集索引、非聚集索引”区别
概述 聚集索引 一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序. 聚集索引确定表中数据的物理顺序.聚集索引类似于电话簿,后者按姓氏排列数据.由于聚集索引规定数据在表中的物理存储顺序,因此一 ...
- 数据结构:Deuque
#include <iostream> #include <stdio.h> #include <string> using namespace std; stru ...
- Jmeter函数助手3-RandomString
RandomString函数用于生成指定内容范围的指定长度随机字符. Random string length:限制生成的长度,比如输入6则会生成6位字符 Chars to use for rando ...
- 4、Git之分支操作
4.1.分支的概述 在版本控制过程中,当需要同时推进多个任务时,可以为每个任务创建的单独分支. 虽然分支的底层实现是指针的引用,但是初学阶段可以将分支简单理解为副本,一个分支就是一个单独的副本. 使用 ...
- 强化学习是否可以AI4Science呢?
最近,华为和Google都推出了AI的天气预报系统(发表了nature.science论文,但是没开放公众使用),可以说这个传统的Science问题已经被AI算法解决,这也说明了传统Science问题 ...
- 传奇人物:“Linux之父”林纳斯·托瓦兹(Linus Torvalds)
偶然看到一个视频: https://www.youtube.com/watch?v=H32IXRkPjHA 林纳斯·托瓦兹(Linus Torvalds)是当之无愧的技术领袖.尤其是那句Just fo ...